【问题标题】:setup.py: run build_ext before anything elsesetup.py:先运行 build_ext
【发布时间】:2015-06-11 04:57:08
【问题描述】:

我正在使用 setup.py,它在 build_ext 步骤中创建了一大堆 SWIG 接口文件。这需要首先运行,因为后续构建步骤需要完整的 python 文件列表才能正常工作(例如将 python 文件复制到包目录、创建 egg、创建源列表等)。

当您执行setup.py install 时,这就是当前发生的情况:

running install
running bdist_egg
running egg_info
running install_lib
running build_py
running build_ext

build_py 步骤尝试将它找到的所有 python 文件复制到构建目录。这些文件在build_ext 运行之前不存在(swig 创建了一堆 .py 文件)。

This answer 建议更改 sub_commands 但这似乎没有任何作用。

我尝试像这样子类化 install 命令类以在其他任何事情之前运行 build_ext

class Build_ext_first(setuptools.command.install.install):
    def run(self):
        self.run_command("build_ext")
        super(Build_ext_first, self).run()

..然后使用cmdclass进行设置:

setup(
    ...
    cmdclass = {'install' : Build_ext_first}
)

但这不起作用,因为super 不适用于旧式类,而且install 显然不是从object 继承的。

如何先build_ext

【问题讨论】:

  • 您可能需要重新表述您的 OP,因为不清楚您的问题是什么。
  • 怎么样?我刚刚添加了步骤列表以及具体出了什么问题

标签: python swig setuptools distutils setup.py


【解决方案1】:

因为害怕在 2 年前的帖子上发帖。我认为解决这个问题的正确方法是在“构建”阶段修复它:

from setuptools import setup, find_packages, Extension
from setuptools.command.build_py import build_py as _build_py    

class build_py(_build_py):
    def run(self):
        self.run_command("build_ext")
        return super().run()

setup(...,
    cmdclass = {'build_py' : build_py},
)

这样它既适用于 bdist_wheel 也适用于安装(尚未测试其他东西)。

注意super 语法在 Python 2 中有点不同:

class build_py(_build_py):
    def run(self):
        self.run_command("build_ext")
        return _build_py.run(self)

【讨论】:

  • 这会导致:File "/tmp/pip-qtEO8z-build/setup.py", line 51, in run return super().run() TypeError: super() takes at least 1 argument (0 given)
  • super 对于 python 2.7 有不同的语法。以上对python 3有效
【解决方案2】:

看起来 super() 的旧方法是向前兼容的,所以我就这样做了:

class Build_ext_first(setuptools.command.install.install):
    def run(self):
        self.run_command("build_ext")
        return setuptools.command.install.install.run(self)


setup(
    ...,
    cmdclass = {'install' : Build_ext_first}
)

【讨论】:

  • 谢谢,这对我很有帮助。
猜你喜欢
  • 2018-05-16
  • 2014-12-21
  • 1970-01-01
  • 2021-04-09
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多