我们有多个版本的包:package1
and package1-unstable
- 类似于tensorflow
and 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
-这可以工作,但这感觉很老套/手动/我还不确定它是否可以在所有操作系统中以可移植的方式工作,并且蟒蛇分布 - 尝试从 setup.py 中调用
pip list
或调用pip show package1
- 当通过 pip 执行设置脚本时,这似乎不起作用,pip install .
因为 pip 不在导入路径本身上 pkg_resources.working_set
使用python setup.py install
但不使用pip install .
可能与调用 pip 不起作用的原因相似:工作集仅包含wheel
并且setuptools
在调用设置时使用pip install .