在Cython中创建可执行文件

时间:2014-03-19 13:35:17

标签: python packages cython executable

一直在玩cython。通常用Python编程,但在前一生中使用过C. 我无法弄清楚如何制作一个独立的可执行文件。

我已经下载了cython,我可以创建一个.pyx文件(这只是一个扩展名为.pyx的普通Python文件),它在Python shell中执行,使用: import pyximport; pyximport.install()

我可以在命令行生成一个.c文件:cython file.pyx 我可以通过构建标准的setup.py并执行:

来生成.so文件
setup.py build_ext --inplace

我尝试使用带有各种选项的gcc从.so文件中创建可执行文件,但总是有大量丢失的文件,标题等。尝试从几乎所有地方指向标题,但没有成功,并且我并不熟悉所有gcc选项的功能,或者即使我应该使用gcc。

我在这里断开了事实,我可以在Python shell中运行我的程序,但不能在命令行运行,(我不希望用户必须进入shell,导入模块等。)

我在这里缺少什么?

3 个答案:

答案 0 :(得分:26)

你想要的是Cython编译器的--embed标志。 它上面没有大量的文档,但this是我能找到的。它确实链接到一个简单的工作示例。

要将Cython源代码编译为C文件,然后可以将其编译为可执行文件,请使用cython myfile.pyx --embed之类的命令,然后使用您正在使用的C编译器进行编译。

编译C源代码时,仍然需要包含带有Python头的目录,并链接到系统上相应的Python共享库(名为libpython27.so或{{1}的文件如果您使用的是Python 2.7)。

编辑:这里有一些关于如何获取命令的更多说明,以便包含正确的标头并链接到正确的库。

正如我之前所说,你需要像这样运行Cython编译器:

libpython27.a

要使用gcc进行编译,您需要找到系统中python标头的位置(您可以通过运行cython <cython_file> --embed 来获取此位置(您必须先导入它)。 它可能只是Python安装目录中的distutils.sysconfig.get_python_inc()子目录。

您还必须找到python共享库。 对于Python 2.7,它在Windows上为/include或在Linux上为libpython27.a

您的gcc命令将是

libpython2.7.so

包含gcc <C_file_from_cython> -I<include_directory> -L<directory_containing_libpython> -l<name_of_libpython_without_lib_on_the_front> -o <output_file_name> 标志可能是明智之举。 在Windows 64位计算机上,您还必须包含标志-fPIC,告诉mingw为64位窗口编译。

如果您正在编译依赖于NumPy的内容,则还需要包含包含NumPy标头的目录。 您可以通过运行-D MS_WIN64(再次导入numpy后)找到此文件夹。 然后你的gcc命令变成

numpy.get_include()

此gcc命令选项guide可能会有所帮助。

另外,如果可能的话,我建议您使用Cython内存视图。 这将使您不必包含NumPy标头并在您的Cython文件中包含NumPy pxd文件。 它还使切片操作更容易让C编译器进行优化。

答案 1 :(得分:5)

在Ubuntu上进行了测试:

使用以下命令(Python 2)安装Cython

sudo apt-get install cython

对于Python 3:

sudo apt-get install cython3

要将Python代码编译为C代码运行(对于Python 3,将cython更改为cython3):

cython --embed -o example.c example.py

这将生成example.c文件。

现在编译example.c文件:

gcc -Os -I /usr/include/python2.7 example.c -lpython2.7 -o example

运行文件:

./example

现在对于Python 3,类似的东西可以工作(未经测试):

gcc -Os -I /usr/include/python3.6 example.c -lpython3.6 -o example

其中python3.x是您计算机上安装的Python版本。

答案 2 :(得分:3)

这是Windows + MS Visual Studio 14的解决方案(目前还没有人提到cl.exe参数)。

首先使用embed参数生成test.c文件:

cython test.pyx --embed

然后编译它:

call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64
cl test.c /I C:\Python37\include /link C:\Python37\libs\python37.lib

输出为小型可执行文件test.exe(对于我来说,print("Hello World")为140 KB)。

注意: