【问题标题】:List installed packages from within setup.py列出 setup.py 中已安装的软件包
【发布时间】:2021-03-13 19:14:21
【问题描述】:

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

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

我们可以硬编码 package1package1-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-infopacakge1-unstable-{version}.dist-info - 这可以工作,但这感觉很hacky/手动/我还不确定它将以可移植的方式在所有操作系统和 python 发行版中工作
  • 尝试从 setup.py 中调用 pip listpip show package1 - 当通过 pip install . 执行设置脚本时,这似乎不起作用,因为 pip 本身不在导入路径上
  • pkg_resources.working_setpython setup.py install 一起使用,但不适用于 pip install .,原因可能与调用 pip 不起作用的原因相似:使用 pip install . 调用设置时,工作集仅包含 wheelsetuptools

【问题讨论】:

    标签: python pip setuptools packaging pkg-resources


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以通过任一方式禁用独立构建

      pip install --no-build-isolation .
      

      PIP_NO_BUILD_ISOLATION=0 pip install .
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-23
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        • 2013-04-04
        • 2011-12-23
        • 1970-01-01
        相关资源
        最近更新 更多