distutils可以在不安装的情况下执行依赖性检查吗?

时间:2011-12-06 19:00:22

标签: python distutils setup.py

是否有可能让distutils运行python模块依赖性分析(并可能安装缺少的模块)而不实际安装python模块?我想象一个命令如下:

./setup.py check-dependencies

将报告目标系统上是否缺少任何相关模块。

3 个答案:

答案 0 :(得分:5)

Python包装中的依赖性是一个令人困惑的主题。很长一段时间,唯一的标准是PEP 314,它定义了requires函数的providesobsoletesdistutils.core.setup参数。用于这些参数的元素是Python模块名称,例如provides=['xml', 'xml.utils']。 PEP对标准库依赖关系不太清楚(我是否必须依赖于Python> = 2.5或者我是否需要'xml'?)并且事实证明,没有使用这些的工具领域(甚至不是自己的)。

然后是setuptools。它介绍了使用项目名称而不是 modules 的其他类型的依赖项,例如,您可以拥有setup(..., install_requires=['PyXML', 'Pylons'], tests_require=['nose']),这非常有用:人们发布软件PyPI使用唯一的项目名称,您可以在设置脚本中使用这些相同的名称来依赖它们,使用easy_install或pip可以安装这些依赖项,模块,脚本等等。

当几年前再次开始使用distutils时,社区标准化了一些setuptools的依赖关系概念,以生成PEP 345,现在在distutils2中实现,旨在取代distutils和setuptools。

总结一下: - 您的安装脚本中可能存在distutils样式的模块级依赖项,这些依赖项是无用的 - 您可能有setuptools样式的项目级deps,由基于setuptools的工具使用 - 您可以在setup.cfg文件中使用符合PEP 345标准的项目级别deps,这些文件由distutils2使用

所以,让我们回答你的问题,你需要告诉我们你有哪种。对于所有实际问题,不应该使用distutils风格的模块deps,因此它留下了setuptools项目deps或新的PEP 345风格的那些,它们仍然是新的并且还没有普及。 distutils2有一个用于setuptools的compat层,因此可以使用它来从基于setuptools的setup.py脚本中获取所需的信息。

与打包工具无关,还有一个工具可以扫描您的代码以找到您正在使用的模块:它是标准库中的模块查找器模块,它不是很熟知或使用,从悲伤状态判断它的代码。此工具不会告诉您使用的模块是来自stdlib还是第三方项目,并且它无法告诉您在setup.pysetup.cfg文件中使用的项目名称。 / p>

HTH

答案 1 :(得分:3)

我认为你能得到的最接近的是:

setup.py install -v -n

表示以详细(-n)模式运行干运行(-v)。

您也可以使用distuitls.dep_util模块,但它不能作为setup.py的选项。

HTH!

答案 2 :(得分:0)

distutils.dep_util关注文件依赖性(即如果somefile.c比somefile.o更新,则somefile.o需要重新编译),而不是项目依赖性。 [希望将此添加为对其他回复的评论,但显然添加评论按钮会添加答案吗?]