如何确定setup.py中实际需要哪些要求?

时间:2018-06-21 21:23:04

标签: python pip

我正在清理未创建的python项目的包装。当前,它做了一些explicitly unsupported魔术来从Requirements.txt文件中获取其依赖项。该文件看起来可能是通过点子冻结生成的。有适用于所有内容的固定版本,并且列出了许多显然过于冗长的软件包。我很确定其中一些不是真正的依赖项,但我不知道是哪个依赖项。

仅给出源代码树,我如何从头开始找出在install_requires中应该包含哪些依赖项?

作为第一个选项,我正在为非stdlib导入语句进行grepping。我希望有更好的方法。

3 个答案:

答案 0 :(得分:3)

由于Python太灵活,因此无法完美地做到这一点。

但是通常有可能做得足够好。

您可以使用stdlib的modulefinder开头。

除此之外,许多项目(大多数是为Python应用程序构建二进制可执行文件,安装程序等设计的项目)提出的启发式方法甚至更进一步。

这些通常有效。而且,当它们失败时,通常会在第一次测试中立即发现它。即使它们还不够用,它们至少还是好的示例代码。这是我的脑海中的一些东西:


如果您想知道为什么这是不可能的:

即使忘记了C扩展模块中的依赖项程序,Python还是太灵活了,无法捕捉通过静态分析导入模块的所有方式。

当然,您必须处理一个疯狂的人编写的代码,而无缘无故地使用显式不受支持的魔术……但是,如果您这样做,没有什么可以阻止某人编写此代码,而不是import lxml 1

with open('picture.jpg', encoding='cp500') as f:
    getattr(sys.modules[11], codecs.encode('vzcbeg_zbqhyr', 'rot13'))(f.read().strip())

实际上,情况不会那么糟糕。但是对于rg import来说,它们容易太糟糕了。

您可以尝试使用简单的导入挂钩动态地检测所有导入,但是只有在您可以使用100%的代码路径的情况下,才能保证工作正常。


1。当然,只有在importlib是加载的第12个模块,并且picture.jpg不是JPEG图像而是文本文件的情况下,这才起作用,该文本文件的内容在EBCDIC中为lxml\n

答案 1 :(得分:2)

我在 pipreqs上取得了不错的成绩,它将根据您的源代码自动生成一个requirements.txt文件。

pipreqs /home/project/location
Successfully saved requirements file in /home/project/location/requirements.txt

答案 2 :(得分:0)

我的意思是,最有效的方法是诚实地逐行浏览代码,确定可能不需要哪些程序包,哪些程序包需要更新,等等。我知道Python 2和3都具有ModuleFinder,它可以查找所有脚本需要成功编译和运行的模块,但是我以前从未使用过它,因此不确定其效果如何,尤其是对于您正在做的事情。但是,如果您有兴趣,我将在下面附加链接。

https://docs.python.org/3/library/modulefinder.html