【问题标题】:Using Python setuptools to put Cython-compiled pyd files in their original folders?使用 Python setuptools 将 Cython 编译的 pyd 文件放在其原始文件夹中?
【发布时间】:2016-05-31 13:40:25
【问题描述】:

我正在尝试为我的 Python 3.4 应用程序构建 setup.py 包,其中包含一个 Cython 模块。我的计划是有一个 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 的 sn-p 在这里(删除了很​​多内容以保留相关内容):

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},
      ...

谢谢! 布赖恩

【问题讨论】:

  • 当你运行 setup.py build 时,可以选择放入特定的文件夹,比如 '.',我暂时不记得了。

标签: python cython setuptools pyd


【解决方案1】:

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

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

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

所以我在这里添加这个是为了未来的搜索者,但我最初的问题仍然存在。

【讨论】:

    【解决方案2】:

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

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

    扩展的全名,包括任何包——即。不是 文件名或路径名,但 Python 虚线名称

    因此,如果您将 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),
    
    ...
    

    您将在所需位置获得已编译的二进制文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2021-07-02
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多