创建 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>", …Run Code Online (Sandbox Code Playgroud) 为 C++ 库创建 Python 接口的最佳/标准方法是什么?
我知道这个问题以前曾在这里问过,但那是在 2008 年,从那时起事情可能/可能已经发生了变化。
我环顾四周并测试了几种不同的方法,但无法决定哪种方法最好。到目前为止,我已经尝试过 Swig、ctypes 和 cppyy,并认为 cppyy 是迄今为止最容易/最快实现的。我已经看到了 Swig 的建议,但是 Swig 花了很长时间才开始工作,而且结果并不令人印象深刻。有现行标准吗?为什么人们如此推荐 Swig,而我却听不到 cppyy 的任何消息?谢谢你。
如果我在 Ubuntu 20.04 系统上的 cppyy v1.6.2 中运行以下测试脚本:
#!/usr/bin/python3
import cppyy
cppyy.cppdef("""
struct Test {
void test() const {
std::cout << std::is_same<int,double>::value << std::endl; // works
std::cout << std::is_same_v<int,double> << std::endl; // doesn't work
}
};
""");
tt = cppyy.gbl.Test()
tt.test()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
input_line_21:5:21: error: no member named 'is_same_v' in namespace 'std'
std::cout << std::is_same_v<int,double> << std::endl; // doesn't work
~~~~~^
input_line_21:5:34: error: expected '(' for function-style cast or type construction
std::cout << std::is_same_v<int,double> << std::endl; // doesn't work
~~~^
Traceback (most …Run Code Online (Sandbox Code Playgroud)