一直在玩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,导入模块等)。
我在这里想念什么?
您想要的是--embedCython编译器的标志。没有一吨就可以了文件,但是这是我能找到。它确实链接到一个简单的工作示例。
--embed
要将Cython源代码编译为C文件,然后可以将其编译为可执行文件,请使用类似的命令cython myfile.pyx --embed,然后使用正在使用的任何C编译器进行编译。
cython myfile.pyx --embed
编译C源代码时,您仍然需要在目录中包含Python标头,并链接到系统上对应的Python共享库(文件名称类似libpython27.so,libpython27.a如果您使用的是Python 2.7)。
libpython27.so
libpython27.a
编辑: 这是有关如何获取命令的更多说明,这些命令包括正确的标头和针对正确的库的链接。
如前所述,您需要像这样运行Cython编译器:
cython <cython_file> --embed
要使用gcc进行编译,您将需要找到python标头在系统上的位置(您可以通过运行获取此位置distutils.sysconfig.get_python_inc()(必须首先将其导入)。它可能只是/includePython安装目录中的子目录。
distutils.sysconfig.get_python_inc()
/include
您还必须找到python共享库。对于Python 2.7,它将libpython27.a在Windows或libpython2.7.soLinux上。
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位窗口编译的标志。
-fPIC
-D MS_WIN64
如果要编译依赖于NumPy的内容,则还需要包括包含NumPy标头的目录。您可以通过运行来找到该文件夹numpy.get_include()(同样,在导入numpy之后)。然后,您的gcc命令变为
numpy.get_include()
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命令选项指南可能会有所帮助。
另外,如果可能的话,我建议您使用Cython内存视图。这样可以避免您在Cython文件中包含NumPy标头并将NumPy pxd文件包含在内。这也使切片操作更易于C编译器优化。