【发布时间】:2020-10-17 19:55:24
【问题描述】:
在为我的 python 桌面应用程序创建跨平台运行时时,我不是新手。我为我的本科生创建了各种工具,主要使用 pyinstaller、cxfreeze、有时是 fbs,有时是公文包。任何经常这样做的人都知道,在使用任意 Python 模块集合时,针对 Linux、Windows 和 macOS 需要进行许多怪癖和调整,但到目前为止,我已经设法弄清楚了一切。
我有一个 python GUI 应用程序,它使用一个庞大且不断变化的 c++ 库,所以我不能只用 python 重新编写它。我已经成功地编写了使用 c++ 库的 python 代码,它使用了一个名为 cppyy 的令人惊叹的(并且可能是神奇的)库,它允许您从 python 运行 c++ 代码而不需要任何努力。一切都在 Linux、mac 和 windows 上运行良好,但我无法将其打包到运行时中,并且我已经尝试了上述所有系统。它们都在生成运行时没有问题(即没有错误),但是当您运行它们时它们会失败。本质上,它们都给出了一些关于无法找到 cppyy-backend 的错误(例如,使用 pyinstaller 的 pyinstaller 和 fbs 在您运行二进制文件时会给出此消息):
/home/nogard/Desktop/cppyytest/target/MyApp/cppyy_backend/loader.py:113: UserWarning: No precompiled header available ([Errno 2] No such file or directory: '/home/nogard/Desktop/cppyytest/target/MyApp/cppyy_backend'); this may impact performance.
Traceback (most recent call last):
File "main.py", line 5, in <module>
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "/home/nogard/Desktop/cppyytest/venv/lib/python3.6/site-packages/PyInstaller/loader/pyimod03_importers.py", line 628, in exec_module
exec(bytecode, module.__dict__)
File "cppyy/__init__.py", line 74, in <module>
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "/home/nogard/Desktop/cppyytest/venv/lib/python3.6/site-packages/PyInstaller/loader/pyimod03_importers.py", line 628, in exec_module
exec(bytecode, module.__dict__)
File "cppyy/_cpython_cppyy.py", line 20, in <module>
File "cppyy_backend/loader.py", line 74, in load_cpp_backend
RuntimeError: could not load cppyy_backend library
[11195] Failed to execute script main
我真的很难过。通常,您使用 pip 安装 cppyy,它会安装 cppyy-backend 和其他包。我什至使用了 cppyy docs 方法来编译每个依赖项以及 cppyy,但结果是一样的。
我将使用任何有效的构建系统...有人成功了吗?我知道我可以使用 docker,但是我之前尝试过这个,我的许多学生都对 docker 感到害怕,要求他们更改他们的 bios 设置以支持虚拟化所以我想使用一个普通的打包系统来生成某种可运行的二进制文件。
如果您知道如何让 pyinstaller、cxfreeze、fbs 或公文包与 cppyy 一起工作(例如,如果您知道如何处理上述错误),请告诉我。但是,如果你有一个与其他系统打包的 cppyy 应用程序,请告诉我,我会使用那个。
如果您正在寻找一些代码来运行,我一直在使用这个最少的代码测试打包方法:
import cppyy
print('hello world from python\n')
cppyy.cppexec('''
#include <string>
using namespace std;
string mystring("hello world from c++");
std::cout << mystring << std::endl;
''')
【问题讨论】:
标签: python pyinstaller packaging cppyy