2013-04-05 103 views
4

我有一堆python代码,我想用一个C接口“编译”到一个共享库中,该接口可以与其他C/C++程序连接,并且不依赖于太多其他libs(可能是python和其他一些dll,但它们都应该被包含到一个包含最终库的目录中)。编译python到共享库

我真的不想为此重写python代码到C++中。我当然可以,但最好有一个独立的lib,可以像dll/so lib一样使用。我已经尝试过使用cython,并希望编译python到C然后只是编译C代码到一个dll,但似乎还没有工作(我还没有能够使它的工作完美无缺)。然后我也试过bbfreeze - 但是bbfreeze支持创建一个.so文件吗?无法找到如何去做。有人知道吗?

您是否知道更直接的其他选项? python代码只需要编译一次。最重要的是,如果它创建一个.so文件,无论它有多大,只是没有太多的依赖关系。

+3

http://stackoverflow.com/questions/138521/is-it-feasible-to-compile-python-to-machine-code – 2013-04-05 22:10:44

+0

http://stackoverflow.com/questions/4421832/compiling-python-to -c-using-cython – 2013-04-05 22:11:02

+0

@JonathanVanasco:为那些伟大的链接+1。它们非常古老('PyPy'自2008年以来已经走过了很长的一段路!),他们专注于编译性能而不是方便分发,所以我认为这是合理的,作为一个单独的问题,但它们是仍然有用的信息。 – abarnert 2013-04-05 22:14:40

回答

-2

Python更多地设置为以其他方式工作:您的代码是从Python调用的,整体逻辑是Python,而特定于问题的(和性能关键代码)是用C/C++编写的。

+2

这不是我问的。必须从已经编写好的Python代码中创建一个C++共享库。我需要C++链接选项,因为我需要使用从C++访问的python实现的功能。 – mkschreder 2013-04-05 23:26:09

+0

@ user1953157,由于python的动态类型和C++的静态类型,这是不可能的。你所要求的将是Python到C++ JIT引擎的等价物,这是不存在的。 – 2013-04-06 01:26:39

+0

@NathanErnst,它是可能的,完全没有意义。它会结合最差的Python特性(相当低效)和C++(长编辑 - 编译链接运行循环)。 – vonbrand 2013-04-06 01:35:49

0

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

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

现在,我明白您可能希望将您的Python脚本嵌入到共享库中:使用传统的GNU工具链这不一定是一件容易的事情。有multiple techniques来实现这一点,但没有一个是官方的,并且都显得太复杂了,而不是仅仅在外部文件中有脚本。

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