distutils能在不安装的情况下进行依赖检查吗?
有没有办法让distutils只运行Python模块的依赖分析(也可能安装缺失的模块),而不实际安装这个Python模块呢?我想象中的命令是这样的:
./setup.py check-dependencies
这个命令会报告目标系统上是否缺少任何依赖的模块。
3 个回答
distutils.dep_util 主要关注的是文件之间的依赖关系。比如说,如果某个文件 somefile.c 比另一个文件 somefile.o 更新,那么就需要重新编译 somefile.o。它并不是关注整个项目之间的依赖关系。 [我本来想把这个作为评论加在其他回复下,但似乎添加评论的按钮会变成回答?]
在Python的打包过程中,依赖关系是个让人困惑的话题。很长一段时间以来,唯一的标准是PEP 314,它定义了distutils.core.setup
函数中的requires
、provides
和obsoletes
参数。用于这些参数的元素是Python模块的名称,比如provides=['xml', 'xml.utils']
。不过,这个PEP对标准库的依赖关系并没有说得很清楚(我需要依赖Python >= 2.5,还是必须要求'xml'
?),而且结果是没有工具使用这些字段(连distutils自己都没有)。
后来出现了setuptools。它引入了其他类型的依赖关系,使用的是项目名称而不是模块,比如你可以写setup(..., install_requires=['PyXML', 'Pylons'], tests_require=['nose'])
,这要实用得多:人们在PyPI上发布软件时使用独特的项目名称,你可以在你的设置脚本中使用这些名称来依赖它们,使用easy_install或pip就能安装这些依赖,包括模块、脚本等等。
几年前,当distutils再次被接管时,社区对setuptools的一些依赖概念进行了标准化,产生了PEP 345,现在在distutils2中实现,目的是替代distutils和setuptools。
总结一下:
- 你可以在设置脚本中使用distutils风格的模块级依赖,但这没什么用
- 你可以使用setuptools风格的项目级依赖,这些依赖被基于setuptools的工具使用
- 你可以在setup.cfg
文件中使用符合PEP 345的项目级依赖,这些依赖被distutils2使用
所以,要回答你的问题,你需要告诉我们你使用的是哪种类型的依赖。实际上,distutils风格的模块依赖不应该使用,所以剩下的就是setuptools项目依赖或新的PEP 345风格的依赖,这些依赖仍然比较新,尚未广泛使用。distutils2有一个兼容层,可以与setuptools一起使用,因此可以通过它从基于setuptools的setup.py
脚本中获取你想要的信息。
与打包工具无关,还有一个工具可以扫描你的代码,找出你正在使用的模块:那就是标准库中的modulefinder模块,这个模块并不太为人所知或使用,从它的代码状态来看也很可怜。这个工具无法告诉你某个模块是来自标准库还是第三方项目,也不能告诉你在setup.py
或setup.cfg
文件中使用的项目名称。
希望这些信息对你有帮助
我觉得你能做到的最接近的就是:
setup.py install -v -n
这意味着以详细模式(-v
)运行一个干运行(-n
)。
你也可以使用 distutils.dep_util 模块,不过它不能作为 setup.py
的一个选项使用。
希望这对你有帮助!