当前位置 : 主页 > 编程语言 > python >

在Cython中创建一个可执行文件

来源:互联网 收集:自由互联 发布时间:2021-06-25
一直在玩cython.通常用 Python编程,但在前一生中使用过C. 我无法弄清楚如何制作一个独立的可执行文件. 我已经下载了cython,我可以创建一个.pyx文件(这只是一个扩展名为.pyx的普通Python文件
一直在玩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,导入模块等).

我在这里错过了什么?

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

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

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

编辑:这里有一些关于如何获取命令的更多说明,包括正确的标题和链接到正确的库.

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

cython <cython_file> --embed

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

您还必须找到python共享库.
对于Python 2.7,它将是Windows上的libpython27.a或Linux上的libpython2.7.so.

那么你的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>

包含-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>

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

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

网友评论