许多第三方Python模块都有一个属性,它保存模块的版本信息(通常类似于module.VERSION
或者module.__version__
),但有些则没有.
这些模块的特定示例是libxslt和libxml2.
我需要检查在运行时是否正在使用这些模块的正确版本.有没有办法做到这一点?
一个潜在的解决方案是在运行时读取源代码,哈希它,然后将它与已知版本的哈希值进行比较,但那是令人讨厌的.
有更好的解决方案吗?
使用pkg_resources.从PyPI安装的任何东西至少应该有一个版本号.
>>> import pkg_resources >>> pkg_resources.get_distribution("blogofile").version '0.7.1'
一些想法:
尝试检查所需版本中是否存在的功能.
如果没有函数差异,请检查函数参数和签名.
如果您无法从功能签名中找到它,请在导入时设置一些存根调用并检查其行为.
我会远离哈希.正在使用的libxslt版本可能包含某些类型的补丁,这些补丁不会影响您对它的使用.
作为替代方案,我建议你不要在运行时检查(不知道这是否是一个硬性要求).对于我编写的具有外部依赖项(第三方库)的python内容,我编写了一个脚本,用户可以运行该脚本来检查他们的python安装,看看是否安装了相应版本的模块.
对于没有定义'version'属性的模块,您可以检查它包含的接口(类和方法),看它们是否与它们期望的接口匹配.然后在您正在使用的实际代码中,假设第三方模块具有您期望的接口.