分发 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.o
、helloworld.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 文件的主要内容,如果未能解决你的问题,请参考以下文章