编译python代码并将其链接到C++程序?
Posted
技术标签:
【中文标题】编译python代码并将其链接到C++程序?【英文标题】:Compile python code and link it to C++ program? 【发布时间】:2014-12-15 14:24:57 【问题描述】:我很清楚存在许多允许 C 代码运行 python 代码的可能性,反之亦然(Cython、Boost.Python、...)。但是,除非我弄错了,否则所有这些方法都只是“调用”相关的 python 脚本并管理 C 程序和 python 脚本之间的交互。所以需要安装python。
在我的情况下,我想要一个独立的解决方案,我的 python 代码可以以某种方式编译并链接到我的主 C++ 程序。我对 Cython 抱有希望,因为它允许我编译我的脚本并创建一个 .so 文件。但是,我似乎无法将该 .so 文件“链接”到我的 C++ 程序。我尝试了以下方法:
一个简单的python脚本,包含一个返回a*b的函数 multiply(a,b) ;我使用 cython 创建了一个 libmultiply.so 文件。 一个简短的 Cpp 文件,输出乘法(5,2)的结果:
int multiply(int, int);
int main()
std::cout << multiply(5,2) << std::endl;
我通过以下方式构建:g++ test.cpp -L/home/jerome/ -lmultiply
这给了我错误:
test.cpp:(.text+0x2b): undefined reference to `multiply(int, int)'
collect2: error: ld returned 1 exit status
我不确定我的尝试是否有意义,但希望它能让您了解我想要实现的目标。
【问题讨论】:
Cython 无法做到这一点。它输出链接到 Python/C API 的代码。除非该 API 可用,否则您从 Cython 构建的任何内容都无法正常工作。它还(AFAIK)做了一些相当激进的名称修改。 你不能“编译”Python代码;它可以在虚拟机上运行。但是,您可以使用类似“PyInstaller”(可以创建 DLL/SO)之类的内容来“冻结”它。那是你想要做的吗?或者也许“trying to understand linking procedure for writing python/c hybrid”会有所帮助。 @snotwaffle 你可以编译它。你只需要编写编译器:-)(因为我不知道有一个现成的)。 您确实意识到,当您在 Python 中编写def multiply(a, b): return a * b
时,C++ 中对应的函数不是 int multiply( int a, int b);
,而是更像boost::any multiply( boost::any a, boost::any b );
。当然,除了它对boost::any
一无所知;实际的函数会有一个类似PyObject* multiply( PyObject*, PyObject* ). And once you've got all of the support for
PyObject, you might as well link in
python.dll`的签名。
@JamesKanze 是的,当然,你是对的,但在提出问题的情况下,这将是使用大锤击中图钉。
【参考方案1】:
Shed Skin 是我能找到的最接近的东西。它将 Python 的类型化子集编译为 c++。可能没有您想要的那么强大,但这是一个奇怪的用例。如果您想自己写一些东西,可以查看LLVM,它已被用来创建与您想要的内容相似的东西。
编辑1:
我刚刚在 github 上找到了这个很棒的 python 列表,Awesome-python,它链接到Pyston,这是一个 python LLVM 实现。可能更适合您的需求或 Python 到 C++ 桥的起点。
【讨论】:
以上是关于编译python代码并将其链接到C++程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何重定向 python 解释器输出并将其捕获到 C++ 程序中的字符串中?
如何在 Linux 中编译 ISPC 代码并将其与普通 cpp 文件链接?
《C++ Primer Plus》学习笔记——C++程序创建到运行的整个过程
C++ 链接到 python 3.2 x64 应用程序无法加载