列出 setup.py 中已安装的软件包

List installed packages from within setup.py

我们的软件包有多个版本:package1package1-unstable - 类似于 tensorflowtf-nightly。这些是 PyPi 上的不同包,但安装相同的模块。当这两个包重叠并写入 site-packages 文件夹中的相同目录时,这就会导致问题。当一个被删除时,另一个包仍然存在,但大部分模块代码现在被删除,导致更糟糕的功能失调状态。

检测碰撞包的最干净的方法是什么?

我们可以硬编码 package1package1-unstable 是相互不兼容的。我们使用 setup.py 进行安装。

我的想法是在 install 命令周围使用包装器 class class。


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.

测试这些方法

我尝试过的几种方法是:

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

您可以通过以下任一方式禁用隔离构建

pip install --no-build-isolation .

PIP_NO_BUILD_ISOLATION=0 pip install .

但是,某些软件包安装依赖于在隔离环境中调用。 其他时候,打包例程使用 pyproject.toml。 这将在非隔离构建中被忽略。