python - 列出 setup.py 中已安装的软件包
问题描述
我们有多个版本的包: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 .
解决方案
在一般情况下,您不能将其作为 setup.py 的一部分来实现,因为 pip 会将您的包构建到一个wheel,缓存它,然后再不调用 setup.py 。您可能最好进行某种以不同方式运行的安装后测试(makefile、tox.ini 等)
推荐阅读
- firebase - 如何从firebase函数中的firebase存储中获取图像的尺寸?
- php - 拆分日期和时间然后放入其他列
- html - 如何将 Flexbox 转化为特定的方式?
- python - Django模型中的Python Pickle对象
- javascript - Angular 6,从由javascript填充的表单字段中的数据外部更新变量
- php - SammyK laravel Facebook PHP SDK,发布到页面
- jenkins - 有没有办法限制使用“与父母一起提交”提交的 Gerrit 合并事件触发的 Jenkins 构建的数量?
- sql - 在 Google BigQuery 中进行交叉透视
- python - 如何修复代码以便 Python 选择随机数
- python - 如何根据条件提取多列