自动Cython,使用Cython批量编译.py文件为.pyd文件!
Project description
AutoCython
自动Cython,使用Cython批量编译.py文件为.pyd文件!
安装
pip install AutoCython-jianjun
使用
这是一个轮子,大多数情况下,你只需要这样就可以很快的把 .py
编译为 .pyd
!
import AutoCython
AutoCython().compile()
- 全自动:自动编译当前目录下所有.py文件,支持指定目录编译或单文件编译;
- 个性化:支持指定排除目录或排除文件跳过编译;
- 高效率:
默认利用全部CPU核心,也可指定使用核心数量;默认启动进程数为cpu核心数四分之一,大多数情况下可以把cpu占满; - 易纠错:快速纠错,在编译失败时能极快的获取错误信息;
前置
Cython : https://github.com/cython/cython
Cython前置
如果你已经正确安装配置好Cython,那么你可以不用看这;
推荐C、C++编译器gcc和VS选一个,其他编译器能否使用未知,具体的安装请查阅Cython的安装教程;
目前测试了64位Python3.6与gcc 64位,与VS2017下都可以通过编译; 需要注意的是,如果你使用的Python是64位的,那么对应的C、C++编译器也必须为64位;
vs安装简便,占用空间大,配置简单;gcc安装简便,占用空间小,配置比较复杂; 不想折腾的话安装vs,想精简一点的话安装gcc。
win下gcc推荐安装MinGW:
具体安装Cython过程请查阅相关资料
使用方式
编译当前目录下能找到的所有py文件:
import AutoCython
ac = AutoCython()
ac.compile()
自定义
AutoCython类接受4个参数,默认为:compile_path='.', exclude=[], mode='f', delete=['b', 'p', 'c']
compile_path : str ,需要编译的目录;
exclude : list,需要排除的目录或者文件:
eg :['./abc', './a_path/test.py', 'test2.py']
这么写会排除目录./abc下的所有.py文件,排除./a_path/test.py文件,排除所有名为test2.py的文件不进行编译
mode : str, 指定使用CPU核心数:
'f' : 使用全部CPU核心数量的四分之一
'n' : 只使用一个,相当于单进程
'4' : 使用4个CPU核心,输入指定使用的数目
delete : list, 指定编译后需要清理的临时文件,一般默认就好:
b : build文件夹
p : 中间文件setup_file py文件
c : 产生的c文件
s : 源代码文件,慎用
all: 全部清理
例子:
编译目录 D:/python_code/ProjectPath
下的所有 .py
文件;
排除所有名为 tmp.py
的文件,排除 ./ProjectPath/print_cy.py
文件,排除 ./ProjectPath/data/tmp
目录下的文件不编译;
使用8个CPU核心;
只删除编译后产生的 build
文件夹和中间文件 setup_file
,保留 C
代码。
import AutoCython
ac = AutoCython(
compile_path='D:/python_code/ProjectPath',
exclude=['tmp.py','./ProjectPath/print_cy.py','./ProjectPath/data/tmp'],
mode='8',
delete=['b', 'p']
)
ac.compile()
AutoCython
类里 compile
和 compile_file
函数的使用和函数参数请参考源代码,参数功能为控制阻塞,并发处理等。
错误处理
在这个目录下:
运行如下代码只编译目录 build_test\
下的 .py
文件;
import AutoCython
ac = AutoCython('./build_test/')
ac.compile()
程序默认会打印出错误文件的错误日志
可以看到 .\build_test\新建文本文档.py
和 .\build_test\test1\test2.py
发生错误,如何手动查看错误信息?
在ipython
下直接打.ac
按TAB
,选择 compile_result
:
再按 TAB
,好了,这时候所有的编译任务都调出来了,错误的任务名称以 ERR_
开头,正确的以 OK_
开头:
选择编号为 2
,错误文件名为 test2
的任务:
其下的属性中其中 err
为错误输出;out
为正常输出;base
为任务 Popen
对象;ExitCode
为编译退出时错误代码,与系统保持一致;PyPath
为源文件目录;PydPath
为编译生成的 pyd
文件目录。
查看错误信息:
可以看到 test2.py
为使用了 Cython
不支持的函数功能 print(end='')
,新建文本文档.py
为文件命名不符合规范,导致编译失败。
- 对于
print(end='')
使用end
参数不能编译通过,可以外部导入一个print_no_end.py
文件,其中自定义end=''
的函数,然后不编译这个print_no_end.py
这个文件就好。 - 解决的方法一是重新命名
新建文本文档.py
,让其文件名符合C
命名规范;
至于其他遇到的问题怎么改,请查阅 Cython
的文档,这只是个轮子。重新编译错误文件可以使用 compile_file
函数单独编译。
在编译时系统会为每一个文件分配一个 ID
,如果有同名文件,其中一个错误,可以通过 ID
很好的找到对应的文件进行错误处理。
所以错误处理你只需要按几个 TAB
就可以查看了,我觉得我这里已经写的够懒了!
命令行
除了把 AutoCython
作为包导入外,AutoCython
也支持直接命令行进行编译:
与上面功能一样的命令行写法:
AutoCython -C D:/python_code/ProjectPath -E tmp.py;./ProjectPath/print_cy.py;./ProjectPath/data/tmp -M 8 -D bp
更新记录
1.20220613 更新对Linux的支持,Linux下需要配置gcc&g++
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for AutoCython_jianjun-1.3.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 32ae82a0e412da5256608ddef7d90de3fa0801c20a8e2476682da6a33f63c987 |
|
MD5 | 8a2b16adfaa20cc563dd778295d4dacd |
|
BLAKE2b-256 | e57f47eeee8bff91e3eaaef8ce709d6feb21a3b9ad3e7ef3dedf7efdb9d7605b |