当前位置: 首页 > 面试题库 >

在Cython中制作可执行文件

尹钱青
2023-03-14
问题内容

一直在玩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编译器的标志。没有一吨就可以了文件,但是这是我能找到。它确实链接到一个简单的工作示例。

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

编译C源代码时,您仍然需要在目录中包含Python标头,并链接到系统上对应的Python共享库(文件名称类似libpython27.solibpython27.a如果您使用的是Python
2.7)。

编辑: 这是有关如何获取命令的更多说明,这些命令包括正确的标头和针对正确的库的链接。

如前所述,您需要像这样运行Cython编译器:

cython <cython_file> --embed

要使用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>

包含该-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命令选项指南可能会有所帮助。

另外,如果可能的话,我建议您使用Cython内存视图。这样可以避免您在Cython文件中包含NumPy标头并将NumPy
pxd文件包含在内。这也使切片操作更易于C编译器优化



 类似资料:
  • 问题内容: 我有一个包含两个简单的Java swing文件的程序。 如何为程序制作可执行的jar文件? 问题答案: jar文件只是包含Java文件集合的文件。为了使jar文件可执行,你需要指定 Class在jar文件中的位置。示例代码如下。 编译你的类。要制作一个jar,你还需要创建一个清单文件()。例如, 将编译后的输出类文件(JarExample.class,JarExample $ 1.cl

  • 我试图用pyinstaller创建python脚本的可执行文件,但它不起作用。 如果我从终端运行exe文件,我得到这些错误: 我在项目的虚拟环境中使用pip安装了pyInster。 我将感谢任何帮助。 先谢谢你。

  • vendor 文件是什么? 任何一个 Composer 程序包想要传递给安装包的用户的命令行脚本都应该被列为 vendor 文件。 如果包包含了包用户不需要的其他脚本(如构建或编译脚本),则代码不应被列为 vendor 文件。 它是如何定义的? 它是通过将 bin 键添加到项目中来定义的 composer.json。它被指定为文件数组,因此可以为任何给定项目添加多个二进制文件。 { "bi

  • 我正在使用JPackage(OpenJDK 15.0.1)为Windows制作一个可移植的可执行文件。我尝试了下面的命令,但我双击了生成的exe文件,显示了安装程序窗口。它似乎不是可移植的可执行文件,而只是安装程序。 有什么办法可以用JPackage制作一个不用安装就可以使用的可执行文件?

  • 我想为我用JavaFX2.0制作的项目制作一个可执行文件。有人能帮我吗?

  • 问题内容: 首先,我已经在Google上进行了搜索,但只找到了将压缩文件(例如)嵌入到Shell脚本中的示例。 基本上,如果我有一个打印字符串的C程序(),请说 Hello World! 。 我编译它以获得可执行的二进制文件 现在我有一个shell脚本 我要问的是是否有可能将二进制( hello )嵌入到shell脚本中,以便在我运行时 它执行二进制文件以打印 Hello World! 。 澄清