Cython编译python项目

news/2024/9/28 5:22:19 标签: python, 人工智能, C, 编译, cython, cythonize

Cython编译python项目

Cythonpython_1">Cython编译python项目

简介

cythonizeCython 编译器的一个命令行工具,用于简化 Cython 扩展模块的构建过程。Cython 是一个用于编写 Python 扩展模块的工具,它允许在 Python 中使用 C 的语法和性能,同时保持 Python 的灵活性和易用性。

具体来说,cythonize 用于将 Cython 源文件(.pyx)编译C 代码,并最终构建为共享库或扩展模块,以供 Python 使用。这个工具的目标是提高性能,同时保持 Python 编码的简洁性和可读性。

安装

单个文件编译

  • 命令行编译

    cythonize -i 文件名
    
  • 基于 setup.py

    python"> from setuptools import setup
     from Cython.Build import cythonize
    
     setup(
         name = 'test',
         ext_modules = cythonize("test.pyx"),
         zip_safe = False,
     )
    
    python setup.py build_ext --inplace
    

编译整个项目

python"># -*- coding: utf-8 -*-
"""

执行前提:
     系统安装python-devel 和 gcc
     Python安装cython
 
编译整个当前目录:
     python py-setup.py
编译某个文件夹:
     python py-setup.py BigoModel
 
生成结果:
     目录 build 下
 
生成完成后:
     启动文件还需要py/pyc担当,须将启动的py/pyc拷贝到编译目录并删除so文件
 
"""
 
import sys, os, shutil, time
from distutils.core import setup
from Cython.Build import cythonize
 
starttime = time.time()
currdir = os.path.abspath('.')
if len(sys.argv) >= 2:    
    path_list = sys.argv[1:]
else:
    path_list = ['.']
print("======")
print("build path:", path_list)
print("======")
#parentpath = sys.argv[1] if len(sys.argv)>1 else ""
#if parentpath == '':
#    print("Error:CopyDir is null!")
#    sys.exit(1)

setupfile= os.path.join(os.path.abspath('.'), __file__)
build_dir = "build"
build_tmp_dir = build_dir + "/temp"
 
def getpy(parentpath='', name='', excepts=(), copyOther=False,delC=False, except_fname=()):
    """
    获取py文件的路径
    :param parentpath: 父路径
    :param name: 文件/夹
    :param excepts: 排除文件
    :param copyOther: 是否copy其他文件
    :param delC: 是否删除C文件
    :param except_fname: 排除的文件名
    :return: py文件的迭代器
    """
    fullpath = os.path.join(parentpath, name)
    for fname in os.listdir(fullpath):
        if fname in except_fname:
            continue
        ffile = os.path.join(fullpath, fname)
        #print('{}\n{}\n{}'.format(parentpath, name, fname))
        #print('-----')
        if os.path.isdir(ffile) and fname != build_dir and not fname.startswith('.'):
            if fname == "__pycache__":
                continue
            for f in getpy(os.path.join(parentpath, name), fname, excepts, copyOther, delC, except_fname):
                yield f
        elif os.path.isfile(ffile):
            ext = os.path.splitext(fname)[1]
            if ext == ".c":
                if delC and os.stat(ffile).st_mtime > starttime:
                    os.remove(ffile)
            elif ffile not in excepts and os.path.splitext(fname)[1] not in('.pyc', '.pyx'):
                if os.path.splitext(fname)[1] in('.py', '.pyx') and not fname.startswith('__'):
                    yield os.path.join(parentpath, name, fname)
                if fname == '__init__.py' and copyOther:
                    dstdir = os.path.join(build_dir, parentpath, name)
                    if not os.path.isdir(dstdir): 
                        os.makedirs(dstdir)
                    shutil.copyfile(ffile, os.path.join(dstdir, fname))
            if copyOther:
                if ffile in excepts:
                    continue
                exclude_suffix = ('.pyc', '.pyx', '.py', '.c')
                if os.path.splitext(fname)[1] in exclude_suffix\
                    or fname.startswith('__'):
                    continue
                dstdir = os.path.join(build_dir, parentpath, name)
                if not os.path.isdir(dstdir): 
                    os.makedirs(dstdir)
                shutil.copyfile(ffile, os.path.join(dstdir, fname))
        else:
            print('#pass [%s]...'%(ffile))
            pass


if __name__ == "__main__": 
    
    for parentpath in path_list:
        #获取py列表
        module_list = list(getpy(parentpath=parentpath, excepts=(setupfile), except_fname=("jupyter_config.py")))
        print(module_list)
        try:
            setup(ext_modules = cythonize(module_list, language_level=3),
               script_args=["build_ext", "-b", build_dir, "-t", build_tmp_dir]
               )
        except Exception as e:
             print (e)
        else:
             module_list = list(getpy(parentpath=parentpath, excepts=(setupfile), copyOther=True))
        module_list = list(getpy(parentpath=parentpath, excepts=(setupfile), delC=True))
        if os.path.exists(build_tmp_dir): 
            shutil.rmtree(build_tmp_dir)
        
        print('## setup [{}] over ...'.format(parentpath))
                
    print("complate! time:", time.time()-starttime, 's')

编译完成后,进行调用。

import main

app = main.app
app.run(host='0.0.0.0',port=8037)

http://www.niftyadmin.cn/n/5242344.html

相关文章

速达软件全系产品任意文件上传漏洞

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 1. 速达软件产品简介 速达软件专注中小企业管理软件,产品涵盖进销存软…

windows10系统下替换、修改jar中的文件并重新打包成jar文件然后运行

目录 1、jar文件简述2、问题来源3、操作步骤3.1 解压jar包3.2 替换或者更改操作3.3 重新打成jar包3.4 确认是否修改成功3.5 运行程序 附录:常见命令参数 1、jar文件简述 JAR 文件就是 Java Archive ( Java 档案文件),它是 Java 的…

Linux-网络服务和端口

域名:便于人们记忆和使用的标识符 www.baidu.com域名解析:将域名转换为与之对应的 IP 地址的过程 nameserver 8.8.8.8ip地址:网络设备的唯一数字标识符 域名ip地址localhost127.0.0.1 网络服务和端口 网络服务端口ftp21ssh22http80https…

Centos 搭建Git私有服务器

要在CentOS上搭建Git私有服务器,您可以按照以下步骤进行操作: 安装和配置Git服务器软件: 确保您的CentOS系统已经安装了Git软件包。您可以使用yum命令安装Git:sudo yum install git。如果您想使用企业级的Git服务器,可…

网络和Linux网络_11(数据链路层)以太网(MAC帧)协议+局域网转发+ARP协议

目录 1. 以太网协议 1.1 MAC地址 1.2 以太网帧格式 2. 局域网转发原理 2.1 数据碰撞和交换机 2.2 最大传输单元MTU 3. ARP协议 3.1 ARP协议格式 3.2 模拟APR协议工作过程 3.3 ARP缓存表 4. 重看TCP/IP四层模型 本篇完。 1. 以太网(MAC帧)协议 网络层的IP协议并不是…

操作教程|JumpServer搭载RD Client App,让你的移动办公更轻松

随着信息技术的普及和发展,移动办公逐渐成为新的时代趋势。移动办公又被称为3A办公,即办公人员可在任何时间(Anytime)、任何地点 (Anywhere)处理与业务相关的任何事情(Anything)。 …

PySpark开发环境搭建常见问题及解决

PySpark环境搭建常见问题及解决 1、winutils.exe问题2、SparkURL问题3、set_ugi()问题 本文主要收录PySpark开发环境搭建时常见的一些问题及解决方案,并收集一些相关资源 1、winutils.exe问题 报错摘要: WARN Shell: Did not find winutils.exe: {} ja…

Ubuntu防止休眠和挂起(笔记)

目录 1 动机2 禁用休眠3 解除休眠 1 动机 我要将 饿啊人制作成 noah-mp 的区域运行强迫,但是跑的慢,一晚上两天。后来发现是因为电脑自动 supend 了。Ubuntu 在电源那里最多只能设置 2 小时的防止休眠,2小时候又自动休眠,严重影响…