一直在玩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,导入模块等。)
我在这里缺少什么?
答案 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)。
注意:
对于GUI应用程序(无控制台应用程序),请参见@longgangfan的答案Can Cython compile to an EXE?,即在/subsystem:windows /entry:wmainCRTStartup
参数中添加cl.exe
。
有关源代码是否仍然存在的更多信息,请参见Are executables produced with Cython really free of the source code?和Does compiled standalone Cython executable still contain all original source code?。
此外,.exe不会在任何计算机上开箱即用;需要其他一些文件,请参见Minimal set of files required to distribute an embed-Cython-compiled code and make it work on any machine。