分发 Cython 生成的 cpp 文件

Posted

技术标签:

【中文标题】分发 Cython 生成的 cpp 文件【英文标题】:Distributing cpp files generated by Cython 【发布时间】:2018-04-03 20:54:53 【问题描述】:

我是 Cython 的新手,我的目标是将它用作一些“翻译器”,将基本的 python 代码编译为 c++ 代码,供其他用户分发和使用。

我已经按照文档中的每个步骤进行操作,比如说我有一些文件 helloworld.pyx:

print("hello world!")

为了将这个 python 代码编译成 c++,我创建了setup.py 文件:

from distutils.core import setup, Extension
from Cython.Build import cythonize

extensions = [
    Extension(
        "helloworld",
        sources=["helloworld.pyx"],
        language="c++"
    ),
]

setup(
    ext_modules = cythonize(extensions),
)

最后我使用python setup.py build_ext --inplace 生成2个新文件-helloworld.ohelloworld.cpp和1个目录-build

在不指定python目录的情况下尝试执行脚本会报错gcc helloworld.cpp:

helloworld.cpp:17:10: fatal error: 'Python.h' file not found
#include "Python.h"
         ^ 1 error generated.

当像 gcc -c -I/usr/include/python2.7 helloworld.cpp -o main.out 这样指定 python 目录时,它可以工作,但不幸的是,输出被编码为不可读的字符。


将python代码编译为可以独立使用的cpp代码的正确方法是什么(没有指定python文件)?

谢谢!

【问题讨论】:

Cython 生成的 cpp 代码不能独立使用——它编译成 Python 扩展模块,并且必须为某些 Python 编译扩展模块(这样它们就可以导入到同一个 Python 中) .如果你正确地构建东西,你的setup.py 将为你用来运行setup.py 的任何 Python 生成一个扩展模块,这就是你想要的。您可以分发这些二进制文件(直接分发,或封装在***中),或分发.pyx 源并在每台机器上构建它,但两者之间的任何东西都很少有用。 很多项目确实分发了 Cython 生成的中间 c/c++ 文件,以避免需要 Cython 来构建,所以它绝对是可行的。 (我不确定如何) lxml 就是这样做的例子(lxml.de/installation.html 上的“从开发源构建 lxml”)。查看他们的setup.py 可能是了解如何进行的好方法 另一种方法是使用“wheel”,它是另一种 Python 包(与许多/遗留包相反,它们是“eggs”)。您可以在***中包含预构建的二进制工件。 @DavidW 您可以通过编写自定义 setup.py 来查找 C++ 文件并编译它们,并且仅在它们丢失时调用 cython。但连基础知识都无法工作的人不应该尝试这样做。 【参考方案1】:

如果您使用的是Conda,您似乎需要libpython-dev 包。

【讨论】:

问题是询问如何删除对 Python 标头的依赖。它不是在问如何安装标题

以上是关于分发 Cython 生成的 cpp 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Cython 包装 C++ 类?

推荐的方式来分发Halide生成的函数?

cython - 包装一个 cpp 类聚合另一个

如何构建和分发依赖于第三方 libFoo.so 的 Python/Cython 包

将 Cython 生成的 .c 文件编译成 exe 文件

通过Cython打包py文件,生成包含pyd的wheel(.whl)