python - 使用 Python setuptools 将 Cython 编译的 pyd 文件放入其原始文件夹中?

标签 python cython setuptools pyd

我正在尝试为包含 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 (如 here in the Building Wheels section 中所述),但这不起作用。 (仍然生成纯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},
      ...

谢谢! 布赖恩

最佳答案

我遇到了类似的问题,并且我找到了一个也适合您的解决方案。

来自 distutils.core.Extension 的官方 Python 文档,name 参数是:

the full name of the extension, including any packages — ie. not a filename or pathname, but Python dotted name

因此,如果您将 setup.py 修改为:

...

extensions = [
    Extension(name='mpf.mc.core.audioaudio_interface',  # using dots!
              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),

...

您将在您想要的位置找到已编译的二进制文件。

关于python - 使用 Python setuptools 将 Cython 编译的 pyd 文件放入其原始文件夹中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35497572/

相关文章:

python - praw:获取 subreddit 中随机帖子的正文和标题

python - 与 Python 中的 string.Template 相反

Python/ Pandas : writing multiple Dataframes to Excel sheets using a "for-loop"

python - setuptools中的package_data有什么用?

python - 如何使用 setuptools 管理多个 python 子项目?

python - object.__new__() 没有参数

python - 如何解决错误 "error compiling Cython file"错误?

python - 将 Cython 中的 numpy 数组传递给需要动态分配数组的 C 函数

cython - 在 Cython 中定义字符串数组

python - 如何在 setup.py(和所需的 C 库)中声明对 gi.repository 的依赖?