gpt4 book ai didi

python - 使用 PyInstaller 构建 Cython 编译的 python 代码

转载 作者:IT老高 更新时间:2023-10-28 21:12:56 25 4
gpt4 key购买 nike

我正在尝试使用 PyInstaller 构建 Python 多文件代码。为此,我使用 Cython 编译了代码,并使用生成的 .so 文件代替 .py 文件。

假设第一个文件是 main.py 而导入的文件是 file_a.pyfile_b.py,我得到 Cython 编译后的 file_a.sofile_b.so

当我把 main.pyfile_a.sofile_b.so 放在一个文件夹中并通过 "python 运行它main.py",它可以工作。

但是当我使用 PyInstaller 构建它并尝试运行生成的可执行文件时,它会为在 file_afile_b 中完成的导入引发错误。

如何解决这个问题?一种解决方案是在 main.py 中导入所有标准模块,这很有效。但是如果我不想更改我的代码,有什么解决办法?

最佳答案

所以我让这个为你工作。

请看一下 Bundling Cython extensions with Pyinstaller

快速入门:

git clone https://github.com/prologic/pyinstaller-cython-bundling.git
cd pyinstaller-cython-bundling
./dist/build.sh

这会产生一个静态二进制文件:

$ du -h dist/hello
4.2M dist/hello
$ ldd dist/hello
not a dynamic executable

并产生输出:

$ ./dist/hello 
Hello World!
FooBar

基本上这归结为生成一个简单的 setup.py,它构建扩展 file_a.sofile_b.so 然后使用 pyinstaller将应用程序的扩展捆绑到一个可执行文件中。

示例setup.py:

from glob import glob
from setuptools import setup
from Cython.Build import cythonize


setup(
name="test",
scripts=glob("bin/*"),
ext_modules=cythonize("lib/*.pyx")
)

构建扩展:

$ python setup.py develop

捆绑应用程序:

$ pyinstaller -r file_a.so,dll,file_a.so -r file_b.so,dll,file_b.so -F ./bin/hello

关于python - 使用 PyInstaller 构建 Cython 编译的 python 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24525861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com