cython编译python_Cython+Pyinstaller Python编译与打包-踩坑

一、目的:

将项目所有的代码,编译成一个独立的二进制文件包,并防止反编译。

二、示例项目结构:

➜ cpdemo tree

.

|-- libs

| |-- A

| | `-- a.py

| `-- B

| `-- b.py

`-- setup

|-- build_pyd.py

`-- main.py

4 directories, 4 files

总共四个文件,A 和 B分别是两个类,其中mian.py 引用a, a引用b:

三、先使用Cython编译:

#build_pyd.py文件内容如下,自行添加要编译的文件路径到cythonize的第一个参数列表里。每个文件会单独编译成一个.so文件。

from distutils.core import setup

from Cython.Build import cythonize

setup(

name='Anything you want',

ext_modules=cythonize(["../libs/A/*.py", "../libs/B/*.py"

], language_level=3

),

)

在setup文件夹下,执行python3 build_pyd.py build_ext --inplace 命令,

执行成功后在setup文件夹里生成两个文件:

a.cpython-36m-x86_64-linux-gnu.so b.cpython-36m-x86_64-linux-gnu.so

执行出错,参考issues-1

四、使用Pyinstaller 打包

执行pyinstaller -F main.py 命令,执行成功在dist目录先生成main文件。执行结果如下:

如果包No module named xxx的错误,参考 issues-3

五、issues:如果出现如下:

Fatal error: can't create build/temp.linux-x86_64-3.6/../libs/A/a.o: No such file or directory

error: command 'gcc' failed with exit status 1

自行在build目录下创建,temp.linux-x86_64-3.6,文件夹,什么原因导致的,不知道。

2. 如果提示pyinstaller未安装,自行使用pip安装:

pip3 install pyinstaller

3. 重点来了,如果出现了ModuleNotFoundError: No module named 'b'

ps:基本都会出现,如果你直接执行python main.py正常的话,这里并不表示你的代码有问题。只是pyinstaller默认不会引入导入再导入的文件,即b.py。因此只需要修改生成的main.spec文件,修改如下,如果有其他文件缺失,自行天街:

然后执行: pyinstaller main.spec

即可:

5241 INFO: Building EXE from EXE-00.toc completed successfully.

六、demo代码rmokerone/cpdemo​github.comv2-7b04610b3b3923ad12dd6973c97c703d_ipico.jpg

七、参考链接https://stackoverflow.com/questions/25733467/no-module-named-when-using-pyinstaller​stackoverflow.comv2-2d47e939feed796bcf7483d306661c88_ipico.jpg

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyInstaller并不支持直接将Python代码打包成dll文件,因为Python代码需要被解释器解释才能运行,而dll文件是编译后的二进制文件,无法被解释器解释。 不过,可以使用CythonPython代码编译成C代码,然后再将其编译成dll文件。Cython是一个能够将Python代码转换为C代码的工具,可以将Python代码中的部分代码编译成C代码,从而提高程序的性能。 以下是使用CythonPython代码打包成dll文件的大致步骤: 1. 安装Cython。可以使用以下命令安装Cython: ``` pip install Cython ``` 2. 将Python代码转换为C代码。使用CythonPython代码转换为C代码。例如,如果要将名为`my_module.py`的Python模块转换成C代码,可以使用以下命令: ``` cython my_module.py ``` 这将生成一个名为`my_module.c`的C代码文件。 3. 编译C代码为dll文件。使用C编译器将C代码编译为dll文件。例如,在Windows平台上,可以使用以下命令: ``` cl /LD /I "C:\Python\include" my_module.c /link /LIBPATH:"C:\Python\libs" /OUT:my_module.dll ``` 这将编译`my_module.c`为名为`my_module.dll`的dll文件。需要将`/I`和`/LIBPATH`参数替换为你的Python安装路径和libs路径。 需要注意的是,使用CythonPython代码转换为C代码时,需要将原有的Python代码中的一部分代码进行修改,以便能够编译成C代码。同时,编译dll文件时也需要根据操作系统和Python版本进行相应的调整。 希望以上步骤可以帮助你使用CythonPython代码打包成dll文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值