首页 > 解决方案 > 列出 setup.py 中已安装的软件包

问题描述

我们有多个版本的包:package1and package1-unstable- 类似于tensorflowand 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

我尝试过的几种方法是:

标签: pythonpipsetuptoolspackagingpkg-resources

解决方案


在一般情况下,您不能将其作为 setup.py 的一部分来实现,因为 pip 会将您的包构建到一个wheel,缓存它,然后再不调用 setup.py 。您可能最好进行某种以不同方式运行的安装后测试(makefile、tox.ini 等)


推荐阅读