我们有一些内部 Python 包与 PyPI 上的包同名 — 比如
package1
、package2
和 package3
。有时,一些用户会错误地安装 PyPI 版本,所以我想知道是否有标准方法来验证他们是否安装了正确的软件包。
我目前的想法是在我们的
package0
中,它与PyPI不冲突,但确实导入了package1
、package2
和package3
,可以做类似的事情:
# package0.__init__.py
import package1
import package2
import package2
for pkg in [package1, package2, package3]:
try:
assert "our-organization" in pkg.__url__
except (AttributeError, AssertionError) as exc:
raise ImportError(
f"An incorrect version of {module.__name__} was detected. "
"Please ensure you have installed correct internal version and not "
f"a package on PyPI with the same name. ({exc})"
)
当然,这只有在加载
package0
时才有效,如果直接在 jupyter 笔记本或其他东西中加载 package1
则不起作用。
importlib.metadata
来内省已安装软件包的元数据。您可以检查元数据中的某些特定值,例如 URL 之一(正如您在问题中所建议的那样),或者可能是 trove 分类器(前缀为 Private ::
的可能是不错的候选者,因为没有这样的 trove 分类器可以位于 PyPI),或多个元数据值的组合。