是否可以确保在 运行 它是 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 也证实了这一点) .我能做些什么来确保 lupa
在 mymodule.script.init()
之前安装,还是安装过程的那个阶段完全不在用户手中?
经过大量研究,it seems this kind of post-install script is somewhat against the core philosophy of setuptools,这意味着不太可能添加这样的请求,或者至少近期不会添加。
幸运的是,这有点因祸得福;我的 post-install 脚本实际上是一个“更新”控制台入口点,用户在添加模组或更新任何包数据时随时调用该入口点。该脚本可以(并且应该)被用户多次调用,因此通过将其作为安装过程的一部分,它有助于从一开始就向用户介绍脚本的用途。这使得安装时的轻微烦恼可以忍受,至少在我的情况下是这样。
我正在分发 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 也证实了这一点) .我能做些什么来确保 lupa
在 mymodule.script.init()
之前安装,还是安装过程的那个阶段完全不在用户手中?
经过大量研究,it seems this kind of post-install script is somewhat against the core philosophy of setuptools,这意味着不太可能添加这样的请求,或者至少近期不会添加。
幸运的是,这有点因祸得福;我的 post-install 脚本实际上是一个“更新”控制台入口点,用户在添加模组或更新任何包数据时随时调用该入口点。该脚本可以(并且应该)被用户多次调用,因此通过将其作为安装过程的一部分,它有助于从一开始就向用户介绍脚本的用途。这使得安装时的轻微烦恼可以忍受,至少在我的情况下是这样。