是否可以确保在 运行 它是 setup.py 之前安装了软件包的依赖项?

Is it possible to ensure a package's dependencies have been installed before running it's setup.py?

我正在分发 Python 包。这取决于库 lupa。我想 运行 一个 post-install 脚本 ,它依赖于 lupa,它在安装后初始化包中的一些数据。在查看了有关 Whosebug 的一些答案后,我的剥离 setup.py 基本上看起来像这样:

# setup.py
from distutils.core import setup
from setuptools.command.install import install

class PostInstallCommand(install):
    def run(self):
        # Do normal setup
        install.run(self)
        # Now do my setup
        from mymodule.script import init
        init()

setup(
    # ...
    install_requires = [
        # ...
        "lupa >= 1.10",
        # ...
    ],
    cmdclass = {
        'install': PostInstallCommand
    }
)

然而,当在 Python 3.10 上用 tox 模拟新的 install/setup 时,我得到这个错误:

File "C:\My\Computer\Temp\pip-req-build-pl0jria3\setup.py", line 26, in run
      from mymodule.script import init
    File "C:\My\Computer\Temp\pip-req-build-pl0jria3\mymodule\script.py", line 28, in <module>
      import lupa
  ModuleNotFoundError: No module named 'lupa'

我的印象是 install_requires 中的任何内容都会在 setup() 完成时安装,但事实并非如此(this answer 也证实了这一点) .我能做些什么来确保 lupamymodule.script.init() 之前安装,还是安装过程的那个阶段完全不在用户手中?

经过大量研究,it seems this kind of post-install script is somewhat against the core philosophy of setuptools,这意味着不太可能添加这样的请求,或者至少近期不会添加。

幸运的是,这有点因祸得福;我的 post-install 脚本实际上是一个“更新”控制台入口点,用户在添加模组或更新任何包数据时随时调用该入口点。该脚本可以(并且应该)被用户多次调用,因此通过将其作为安装过程的一部分,它有助于从一开始就向用户介绍脚本的用途。这使得安装时的轻微烦恼可以忍受,至少在我的情况下是这样。