我正在尝试为包含 Cython 模块的 Python 3.4 应用程序构建 setup.py 包。我的计划是有一个 setup.py 文件,它需要 Cython 并编译 .pyx 文件,我通常会在 Win32(x86 和 x64)和 Mac 上运行它,然后生成平台轮并将它们上传到 PyPI,所以普通用户不需要 Cython 或编译任何东西。
目前我可以获得 setup.py 脚本来构建 .pyd 文件,但它不会将构建的 .pyd 文件放在与我需要的原始 .pyx 文件相同的位置。
我尝试手动复制 .pyd 文件,但是当我通过 bdist_wheel 生成轮子时,我得到了一个纯 Python 轮子,我认为这是错误的,因为我构建的 .pyx 文件的版本取决于平台。我还尝试对类进行子Distribution
类化并强制is_pure()
返回 False(如Building Wheels 部分中所述),但这不起作用。(仍然生成一个纯 Python 轮子。)
我假设如果我可以让 setup.py 脚本将编译后的文件放在正确的位置,那么轮子就不会是纯 Python 并且一切都会好起来的。
所以我的问题是:
- setup.py 中是否有某种设置来告诉它将编译的 Cython 文件放在与源文件相同的位置?
- 或者有没有办法将编译后的文件复制到我需要它们的位置,但轮子仍然是非纯的?
- 还是我以错误的方式解决这个问题。我应该更改我的 Python 代码以从其他地方提取已编译的包吗?(这对我来说似乎不对。)
- [编辑] 或者我应该把编译好的二进制 .pyd / .so / .dylib 放入包中,添加逻辑以在运行时根据架构获得正确的 .pyd,然后有一个纯 Python 轮子?(这对我来说似乎也不对。)
有关我的设置的更多信息:我在 setup.py 脚本中使用了 setuptools(不是 distutils)。我的 setup.py 片段在这里(删除了很多内容以保留相关内容):
from setuptools import setup, Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
...
extensions = [
Extension(name='audio_interface',
sources=['mpf/mc/core/audio/audio_interface.pyx'],
include_dirs=include_dirs,
library_dirs=library_dirs,
libraries=libraries,
extra_objects=extra_objects,
extra_compile_args=extra_compile_args,
extra_link_args=extra_link_args),
...
setup(
...
ext_modules=cythonize(extensions),
cmdclass= {'build_ext': build_ext},
...
谢谢!布赖恩