列出 setup.py 中已安装的软件包
List installed packages from within setup.py
我们的软件包有多个版本:package1
和 package1-unstable
- 类似于 tensorflow
和 tf-nightly
。这些是 PyPi 上的不同包,但安装相同的模块。当这两个包重叠并写入 site-packages 文件夹中的相同目录时,这就会导致问题。当一个被删除时,另一个包仍然存在,但大部分模块代码现在被删除,导致更糟糕的功能失调状态。
检测碰撞包的最干净的方法是什么?
我们可以硬编码 package1
和 package1-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
.
测试这些方法
我尝试过的几种方法是:
- 使用
site.getsitepackages()
,遍历目录并检查给定的包目录是否存在(即 package1-{version}.dist-info
或 pacakge1-unstable-{version}.dist-info
- 这可以工作,但这感觉很麻烦/手动/ 我还不确定它是否能以可移植的方式跨所有操作系统和 python 发行版
- 尝试从 setup.py 中调用
pip list
或 pip show package1
- 当通过 pip install .
执行设置脚本时这似乎不起作用,因为 pip 未打开导入路径本身
pkg_resources.working_set
适用于 python setup.py install
但不适用于 pip install .
可能出于与调用 pip 不起作用类似的原因:工作集仅包含 wheel
和 setuptools
使用 pip 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
。
这将在非隔离构建中被忽略。
我们的软件包有多个版本:package1
和 package1-unstable
- 类似于 tensorflow
和 tf-nightly
。这些是 PyPi 上的不同包,但安装相同的模块。当这两个包重叠并写入 site-packages 文件夹中的相同目录时,这就会导致问题。当一个被删除时,另一个包仍然存在,但大部分模块代码现在被删除,导致更糟糕的功能失调状态。
检测碰撞包的最干净的方法是什么?
我们可以硬编码 package1
和 package1-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
.
我尝试过的几种方法是:
- 使用
site.getsitepackages()
,遍历目录并检查给定的包目录是否存在(即package1-{version}.dist-info
或pacakge1-unstable-{version}.dist-info
- 这可以工作,但这感觉很麻烦/手动/ 我还不确定它是否能以可移植的方式跨所有操作系统和 python 发行版 - 尝试从 setup.py 中调用
pip list
或pip show package1
- 当通过pip install .
执行设置脚本时这似乎不起作用,因为 pip 未打开导入路径本身 pkg_resources.working_set
适用于python setup.py install
但不适用于pip install .
可能出于与调用 pip 不起作用类似的原因:工作集仅包含wheel
和setuptools
使用pip 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
。
这将在非隔离构建中被忽略。