Python嵌入

时间:2012-06-27 14:48:24

标签: python gcc embed

我想有一个嵌入Python解释器和一个小脚本的大二进制文件 - 我对这整个静态链接,配置和放大器都是全新的。 make和GCC等。请问,有人可以向我描述构建此类可执行文件的基本步骤吗?

我在MacOS 10.6上,我下载了Python 3.3 beta。然后,我创建了“test.c”:

#include <Python.h>

int
main(int argc, char *argv[])
{
  Py_Initialize();
  PyRun_SimpleString("from time import time,ctime\n"
                     "print('Today is', ctime(time()))\n");
  Py_Finalize();
  return 0;
}

现在,在一个文件夹中,我有“Python-3.3.0b1”文件夹和“test.c”文件。

我打字:

gcc -I ./Python-3.3.0b1 -o test test.c

但是我收到了很多“包含”错误。

但我甚至不确定这是否是正确的方法......?我应该首先以某种方式构建Python,然后将其“链接”为“test.c”吗?

顺便说一下,如果Python发布了,他们会使用相同的“./configure”和“make”程序吗?他们是使用一些特殊选项还是我能够构建与python.org提供的非常相似(相同)的Python可执行文件?

另外,我尝试了这个“./configure”和“make”,它创建了一个名为“build / lib.macosx-10.6-x86_64-3.3”的文件夹,里面有很多* .so文件(?)但是什么都没有叫做“python”或类似的......?

3 个答案:

答案 0 :(得分:3)

问题是gcc对Python安装知之甚少,并没有正确链接所有头文件。您需要从distutils获取该信息,并尝试找出如何将该信息导入gcc。在Python文档的嵌入部分的Linking Requirements中可以更好地解释这一点。

但是有一种更简单的方法。有一个名为pymkfile.py的脚本将创建一个make文件,其中包含您需要的所有信息。参见this tutorial的第4节。

从第4节开始,非常类似于您尝试做的示例:

  

嵌入Python代码的最简单方法是使用   PyRun_SimpleString()函数。这个函数向它发送一行代码   翻译。因为解释器是持久的,就像在交互式Python会话中键入各行一样,这意味着您可以执行新行到   通过每行代码调用PyRun_SimpleString来解释器。例如,   下面的代码运行一个简单的Python程序来拆分和重新组合字符串:

#include <Python.h>
int main()
{
printf("String execution\n");
Py_Initialize();
PyRun_SimpleString("import string");
PyRun_SimpleString("words = string.split('rod jane freddy')");
PyRun_SimpleString("print string.join(words,', ')");
Py_Finalize();
return 0;
}
  

您可以看到基本结构很简单。你有初始化和最终确定   步骤和嵌入之间是对Python解释器的调用。要编译   程序,复制代码并将其保存到名为pystring.c的文件中。首先,使用脚本   构建一个合适的Makefile:

$ pymkfile.py pystring > Makefile
  

现在,运行make来实际构建代码。在最终申请创建后,   运行应用程序以查看结果:

$ ./pystring

String execution
rod, jane, freddy
  

您刚刚使用C包装器执行了一些简单的Python代码。你可以用   执行使用嵌入式Python的许多不同任务的相同基本技术   在一个应用程序中唯一明显的限制是,实质上是两个组成部分   是分开的。嵌入式Python解释器之间没有通信   和主机C应用程序。

     

所以,你给了解释器一些代码,然后执行并打印出来;请注意如何   您不必从解释器获取输出,然后打印它:解释器将信息直接发送到标准输出。

答案 1 :(得分:2)

你考虑过使用py2app吗?如果您只对发布脚本而不是编写C代码感兴趣,那么它可以更好地满足您的需求。

http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html

答案 2 :(得分:1)

  

另外,我尝试了这个“./configure”和“make”,它创建了一个文件夹   称为“build / lib.macosx-10.6-x86_64-3.3”,包含大量* .so文件(?)   但没有什么叫“蟒蛇”或类似的东西......?

.so个文件是目标文件。 python可执行文件仅在您调用make install后生成,因此有三个步骤:

./configure
make
make install

最后一步通常涉及sudo

确保您没有更换系统Python。不是一个好主意。

如果您使用的是OS X,通常的方法是与OS X Python系统框架链接。这看起来像嵌入式Python,但您链接到现有的Python系统。系统Python链接目标是libpython.dylib

中的/usr/lib

如果您不喜欢使用Xcode,只需使用Google的“嵌入式Python OS X”并找到一个很好的教程。

我第一次使用THIS教程时就这样做了。