5

我想要一个嵌入 Python 解释器和一个小脚本的大型二进制文件 - 我对整个静态链接、配置和制作以及 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 “或类似的......?

4

3 回答 3

3

问题是 gcc 对您的 Python 安装不够了解,并且没有正确链接所有标头。您需要从中获取该信息distutils并尝试弄清楚如何将该信息获取到 gcc 中。这在 Python 文档的嵌入部分的链接要求中有更好的解释。

但是有一个更简单的方法。有一个名为的脚本pymkfile.py将创建一个make包含您需要的所有信息的文件。请参阅本教程的第 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 应用程序之间没有通信。

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

于 2012-06-27T15:05:01.763 回答
2

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

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

于 2012-06-27T14:52:46.187 回答
1

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

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

./configure
make
make install

最后一步通常涉及sudo

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

如果您在 OS X 上,通常的方法是与 OS X Python 系统框架链接。这“看起来”像嵌入式 Python,但您正在链接到现有系统 Python。系统 Python 链接目标libpython.dylib/usr/lib

如果您不反对使用 Xcode,只需 Google 'embedded Python OS X' 并找到一个很好的教程。

我第一次使用这个教程。

于 2012-06-27T21:03:02.260 回答