使用Python setuptools将Cython编译的pyd文件放在原始文件夹中?

Bri*_*den 5 python setuptools pyd cython

我正在尝试为包含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,一切都会好的.

所以我的问题是:

  1. 在setup.py中是否有某种设置告诉它将已编译的Cython文件放入与源文件相同的位置?
  2. 或者有没有办法将编译后的文件复制到我需要它们的位置,但是仍然可以将轮子构建为非纯粹的?
  3. 或者我是以错误的方式解决这个问题.我应该更改我的Python代码以从其他地方提取已编译的包吗?(这对我来说似乎不对.)
  4. [编辑]或者我应该将已编译的二进制文件.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},
      ...
Run Code Online (Sandbox Code Playgroud)

谢谢!布赖恩

Bri*_*den 2

我找到了一个解决当前问题的解决方法,即添加--plat-namepython setup.py bdist_wheel命令中。(这是在wheel 0.27.0中添加的。不知道为什么它没有出现在我之前的所有搜索中。)

所以这通过我清单上的第 2 项解决了我的问题。我将 pyx 编译为 .pyd 或 .so,将其复制回正确的位置,然后用于--plat-name创建特定于平台的轮子。

然而我的问题仍然存在,因为如果我们添加更多 Cython 模块,我们是否会编译然后将它们全部手动复制回原来的位置,或者有没有办法让它们编译并自动转到原来的位置?另外,我这样做的方式涉及两个不同的 setup.py 文件——一个用于编译,另一个用于安装包。

因此,我在这里添加此内容是为了将来的搜索者的利益,但我最初的问题仍然存在。