在运行时检查Python模块版本

许多第三方Python模块都有一个保存模块版本信息的属性(通常是module.VERSIONmodule.__version__ ),但有些则不然。

这种模块的具体例子是libxslt和libxml2。

我需要检查在运行时正在使用这些模块的正确版本。 有没有办法做到这一点?

一个潜在的解决scheme将是在运行时读取源代码,对其进行散列,然后将其与已知版本的散列进行比较,但这很糟糕。

有更好的解决scheme吗?

我会远离哈希。 正在使用的libxslt版本可能包含某些不影响您使用的补丁types。

作为替代,我想build议你不要在运行时检查(不知道这是否是一个困难的要求)。 对于我编写的具有外部依赖关系(第三方库)的Python东西,我编写了一个脚本,用户可以运行它来检查它们的python安装,以查看是否安装了适当版本的模块。

对于没有定义“版本”属性的模块,你可以检查它包含的接口(类和方法),看它们是否与他们期望的接口匹配。 然后,在您正在处理的实际代码中,假定第三方模块具有您期望的接口。

使用pkg_resources 。 从PyPI安装的任何东西至less应该有一个版本号。

 >>> import pkg_resources >>> pkg_resources.get_distribution("blogofile").version '0.7.1' 

一些想法:

  1. 尝试检查存在或不存在于您需要的版本的function。
  2. 如果没有function差异,请检查函数参数和签名。
  3. 如果你不能从函数签名中找出它,在导入时设置一些存根调用并检查它们的行为。

您可以使用

 pip freeze 

以需求格式查看已安装的软件包。