【发布时间】:2021-03-13 19:14:21
【问题描述】:
我们的软件包有多个版本:package1 和 package1-unstable - 类似于 tensorflow 和 tf-nightly。这些是 PyPi 上的不同包,但安装相同的模块。当安装这两个包时,这会导致问题,因为它们重叠并写入站点包文件夹中的相同目录。当一个包被删除时,另一个包仍然存在,但现在大部分模块代码都被删除了,导致更糟糕的、功能失调的状态。
检测碰撞包最干净的方法是什么?
我们可以硬编码 package1 和 package1-unstable 是相互不兼容的。我们使用 setup.py 进行安装。
我的想法是在 install 命令类周围使用包装类。
class Install(install):
def run(self):
if name == "package1":
self.ensure_not_installed("package1-unstable")
else:
self.ensure_not_installed("package1")
install.run(self)
def ensure_not_installed(pkg_name):
"""Raises an error when pkg_name is installed."""
...
...
cmdclass={'install': Install},
这种方法似乎是一个大方向。但是,我不确定如何详尽列出已安装的软件包。我正在使用pip install . 和python setup.py install 测试这些方法。
我尝试过的几种方法是:
- 使用
site.getsitepackages(),遍历目录并检查给定包目录是否存在(即package1-{version}.dist-info或pacakge1-unstable-{version}.dist-info- 这可以工作,但这感觉很hacky/手动/我还不确定它将以可移植的方式在所有操作系统和 python 发行版中工作 - 尝试从 setup.py 中调用
pip list或pip show package1- 当通过pip install .执行设置脚本时,这似乎不起作用,因为 pip 本身不在导入路径上 -
pkg_resources.working_set与python setup.py install一起使用,但不适用于pip install .,原因可能与调用 pip 不起作用的原因相似:使用pip install .调用设置时,工作集仅包含wheel和setuptools
【问题讨论】:
标签: python pip setuptools packaging pkg-resources