0

我们有多个版本的包: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

我尝试过的几种方法是:

  • 使用site.getsitepackages(),遍历目录并检查给定包目录的存在(即package1-{version}.dist-infopacakge1-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 .
4

2 回答 2

0

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

于 2020-12-02T03:17:40.047 回答
0

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

pip install --no-build-isolation .

或者

PIP_NO_BUILD_ISOLATION=0 pip install .

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

于 2021-10-12T16:42:54.857 回答