5

我正在尝试将 Python 3 脚本转换为 C,然后将该 C 文件编译为可执行文件。

我有这个简单的python脚本:

def greet(name = ""):
  print("Hello {0}".format(name if len(name) > 0 else "World"))

greet("Mango")

我已使用以下方法将此脚本转换为 C:

cython greet.py -o greet.c

然后我使用以下方法编译了 C 文件:

cc greet.c -o greet

输入最后一个命令后,出现错误:

致命错误:Python.h:没有此类文件或目录编译终止。

在我得到错误后,我回过头来意识到我正在使用 Python3,并且我忘记了“cython”之后的“3”。
因此使用以下命令重新编译了 python 脚本:

cython3 greet.py -o greet.c

然后尝试使用以下命令重新编译 C 文件:

cc greet.c -o greet

这再次失败并引发了同样的错误,所以我在 SO 和 Google 上搜索并发现了这些问题:

这些问题中的这些答案都不起作用。

我已经确保我已经使用 cython 安装了所有正确的依赖项apt-get install,但遗憾的pip install是它似乎仍然无法正常工作。

4

3 回答 3

6

检查文档。这还不够gcc x.c -o x

本页解释编译:http ://docs.cython.org/src/reference/compilation.html

它还有很多,但直接的答案是:

编译您的 .c 文件会因您的操作系统而异。编写扩展模块的 Python 文档应该有一些关于你的系统的细节。这里我们举一个Linux系统上的例子:

$ gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o yourmod.so yourmod.c

当然,在你的情况下,它会更接近-I/usr/include/python3.4,甚至$(pkg-config --libs --cflags python3)。而且你不是用 构建的-shared,因为你想要一个可执行文件。

最短的“这必须起作用”的命令集是:

cython3 --embed greet.py -o greet.c
gcc $(pkg-config --libs --cflags python3) greet.c -o greet

pkg-config如果丢失,您需要安装。

于 2016-04-04T10:07:53.470 回答
0

正如@viraptor 的回答向您展示的那样,根据我的评论,您的主要问题是您需要告诉您的C 编译器(例如gcc)在哪里可以找到所需的python 头文件(pyconfig.hPython.h)。为此,您需要将-I选项传递给gcc.

另一个答案建议使用pkg-config将其添加到您的命令行。但是,像您一样,使用 Ubuntu 14.04cython3python3-dev安装,使用此方法会导致编译的程序退出并出现分段错误。

所以,我建议你回到基础。后

cython greet.py -o greet.c

运行以下命令。它假设Python.h和朋友在标准位置(即您已经完成了标准安装python3-dev

gcc -I/usr/include/python3.4m -o greet greet.c -lpython3.4m

如果这不起作用 - 使用find / -iname Python.h查找必要文件的位置并-I相应地更改路径。

随着时间的推移,当您想在更复杂的程序(例如链接到其他 C 库的程序)上使用 cython 时,您需要了解需要传递的其他选项以gcc使其正确编译和链接。但是,为了让您继续前进,上述内容应该可以工作(根据您的规范在 Ubuntu 14.04 上测试)

PS我不确定为什么这个pkg-config建议不起作用 - 但对我来说,它似乎添加了一条额外的路径来-I破坏事情。

于 2016-04-04T22:27:45.433 回答
-2

蟒蛇2:

python -m pip install --upgrade cython

蟒蛇 3:

python3 -m pip install --upgrade cython
于 2022-02-23T17:20:10.030 回答