c++ - 将python编译成共享库

标签 c++ python c compiler-construction

我有一堆 python 代码,我想将它们“编译”到一个带有 C 接口(interface)的共享库中,该接口(interface)可以与其他 C/c++ 程序链接,并且无需依赖太多其他库(可能是 python 和一些其他 dll,但它们都应包含在包含最终 lib 的目录中)。

我真的不想为此将 python 代码重写为 C++。我当然可以,但最好有一个独立的库,可以像 dll/so 库一样使用。

我已经尝试过 cython 并想将 python 编译为 C,然后将 C 代码编译为一个 dll,但这似乎还不能正常工作(我还不能让它完美地工作)。然后我也尝试了 bbfreeze - 但 bbfreeze 是否支持创建 .so 文件?无法找出如何去做。有人知道吗?

您是否知道其他更直接的选择? python代码只需要编译一次。最好的是,如果它创建一个单一的 .so 文件,无论它有多大,都可以在没有太多依赖的情况下工作。

最佳答案

您可以在 C++ 应用程序中将 Python 用作库:它称为 Python/C API .

这个想法是您初始化自己的解释器,然后在其中加载脚本。您可以通过 Python 解释器内的全局变量或模块公开您的 C++ 对象,以便您的代码与之交互,您可以直接从您的 C++ 代码运行 Python 函数。

现在,我了解到您可能希望将 Python 脚本嵌入到共享库中:使用传统的 GNU 工具链,这不一定是一项简单的任务。有multiple techniques实现这一目标,但没有一个是官方的,而且与仅将脚本放在外部文件中相比,一切似乎都太复杂了。

如果您的目标是对最终用户隐藏脚本,您可以对它们进行签名或使用私钥加密并将公钥嵌入您的库中,但请记住,任何人都可以轻松检索该 key 有足够的动力。

关于c++ - 将python编译成共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15844383/

相关文章:

c++ - 在C++中识别多余头文件的工具

c++ - init.d 守护程序脚本 (linux) 中的 lockfile 用途

c++ - 3D hasing : should I use unions as keys and how? 的 unordered_map 的最佳使用

javascript - 奇怪的浏览器描述PyQt

python - Django Admin 使用 nginx 端口 443 挂起

python - 使用 python ('NoneType' 对象进行网页抓取没有属性 'get_text' )

c++ - PCL : Failed to find match for field 'rgba'

c - 为什么即使我没有尝试修改字符串,C 中的字符串也会被修改?

c - 如何在C中定义两个实现?

c# - Sample.exe : 0xC0020001: The string binding is invalid 中 0x7537812f 处的未处理异常