Pau*_*son 25 python executable packages cython
一直在玩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
Run Code Online (Sandbox Code Playgroud)
我尝试使用带有各种选项的gcc从.so文件中创建一个可执行文件,但总是有大量丢失的文件,标题等.尝试过从几乎所有地方指向标题,但没有成功,并且我并不熟悉所有gcc选项的功能,或者即使我应该使用gcc.
我在这里断开了事实,我可以在Python shell中运行我的程序,但不是在命令行,(我不希望用户必须进入shell,导入模块等).
我在这里错过了什么?
Ian*_*anH 34
你想要的是--embedCython编译器的标志.没有一吨就可以了文件,但是这是我能找到.它确实链接到一个简单的工作示例.
要将Cython源代码编译为可以编译为可执行文件的C文件,可以使用类似命令cython myfile.pyx --embed,然后使用您正在使用的C编译器进行编译.
编译C源代码时,仍然需要包含带有Python头的目录,并链接到系统上相应的Python共享库(一个名称类似的文件libpython27.so或者libpython27.a如果您使用的是Python 2.7).
编辑:这里有一些关于如何获取命令的更多说明,包括正确的标题和链接到正确的库.
正如我之前所说,你需要像这样运行Cython编译器:
cython <cython_file> --embed
Run Code Online (Sandbox Code Playgroud)
要使用gcc进行编译,您需要找到系统中python头的位置(您可以通过运行获取此位置distutils.sysconfig.get_python_inc()(您必须先导入它).它可能只是/includePython安装目录中的子目录.
您还必须找到python共享库.对于Python 2.7,它将libpython27.a在Windows或libpython2.7.soLinux上.
那么你的gcc命令就是
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>
Run Code Online (Sandbox Code Playgroud)
包含-fPIC旗帜可能是明智之举.在Windows 64位计算机上,您还必须包含-D MS_WIN64告诉mingw为64位窗口编译的标志.
如果您正在编译依赖于NumPy的内容,则还需要包含包含NumPy头的目录.您可以通过运行numpy.get_include()(再次导入numpy后)找到此文件夹.然后你的gcc命令就变成了
gcc <C_file_from_cython> -I<include_directory> -I<numpy_include_directory> -L<directory_containing_libpython> -l<name_of_libpython_without_lib_on_the_front> -o <output_file_name>
Run Code Online (Sandbox Code Playgroud)
此gcc命令选项指南可能会有所帮助.
另外,如果可能的话,我建议您使用Cython内存视图.这将使您不必包含NumPy标头并在您的Cython文件中包含NumPy pxd文件.它还使切片操作更容易让C编译器进行优化.
这是 Windows + MS Visual Studio 14 的解决方案(因为还没有人提到参数cl.exe)。
首先使用embed参数生成test.c文件:
cython test.pyx --embed
Run Code Online (Sandbox Code Playgroud)
然后编译它:
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
Run Code Online (Sandbox Code Playgroud)
输出是一个小的可执行文件test.exe(在我的例子中为 140 KB print("Hello World"))。
笔记:
对于 GUI 应用程序(并且没有控制台应用程序),请参阅@longgangfan 的回答Can Cython 编译为 EXE?,即添加/subsystem:windows /entry:wmainCRTStartup参数cl.exe。
有关源代码是否仍然存在的更多信息,请参阅使用 Cython 生成的可执行文件真的不含源代码吗?编译后的独立 Cython 可执行文件是否仍包含所有原始源代码?。
此外,.exe 不能在任何机器上开箱即用地运行;还需要一些其他文件,请参阅分发嵌入 Cython 编译的代码并使其在任何计算机上运行所需的最小文件集。
在Ubuntu上进行了测试:
安装Cython使用以下(Python的2):
sudo apt-get install cython
Run Code Online (Sandbox Code Playgroud)
对于Python 3:
sudo apt-get install cython3
Run Code Online (Sandbox Code Playgroud)
编译Python代码成C代码运行(变化cython到cython3用于Python 3):
cython --embed -o example.c example.py
Run Code Online (Sandbox Code Playgroud)
这将生成example.c文件。
现在编译example.c文件:
gcc -Os -I /usr/include/python2.7 example.c -lpython2.7 -o example
Run Code Online (Sandbox Code Playgroud)
运行文件:
./example
Run Code Online (Sandbox Code Playgroud)
现在,对于Python 3,类似的东西将起作用(未经测试):
gcc -Os -I /usr/include/python3.6 example.c -lpython3.6 -o example
Run Code Online (Sandbox Code Playgroud)
python3.x您的计算机上安装的Python版本在哪里。
| 归档时间: |
|
| 查看次数: |
21788 次 |
| 最近记录: |