gpt4 book ai didi

python - 在 Cython 中制作可执行文件

转载 作者:IT老高 更新时间:2023-10-28 20:32:47 28 4
gpt4 key购买 nike

一直在玩 cython。通常使用 Python 编程,但在前世使用过 C。我不知道如何制作独立的可执行文件。

我已经下载了 cython,我可以制作一个 .pyx 文件(这只是一个带有 .pyx 扩展名的普通 Python 文件),它在 Python shell 中执行,使用:导入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 共享库(一个类似 libpython27.so 的文件或 libpython27.a 如果您使用的是 Python 2.7)。

编辑:以下是有关如何获取包含正确 header 和链接到正确库的命令的更多说明。

正如我之前所说,您需要像这样运行 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 header 的目录。您可以通过运行 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 内存 View 。这样您就不必包含 NumPy header 并将 NumPy pxd 文件包含在 Cython 文件中。它还使 C 编译器更容易优化切片操作。

关于python - 在 Cython 中制作可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22507592/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com