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

And*_*rew 5 python pip

我正在清理一个我没有创建的 python 项目的包装。目前,它做了一些明确不受支持的魔法来从 requirements.txt 文件中获取它的依赖项。该文件看起来可能是由 pip freeze 生成的;所有东西都有固定版本,并且列出了许多明显无关的软件包。我很确定其中一些不是真正的依赖项,但我不知道哪些。

仅给定源代码树,我如何从头开始弄清楚 install_requires 中应该包含哪些依赖项?

作为第一次尝试,我正在寻找非标准库导入语句。我希望有更好的方法。

aba*_*ert 5

没有办法完美地做到这一点,因为 Python 太灵活了。

\n\n

但通常可以做得足够好。

\n\n

您可以使用 stdlib\'s 来启动modulefinder

\n\n

除此之外,许多项目\xe2\x80\x94(主要是为Python应用程序\xe2\x80\x94构建二进制可执行文件、安装程序等而设计的项目)已经提出了更进一步的启发式方法。

\n\n

这些通常有效。而且,当它们失败时,您通常会在第一次测试中立即发现它。即使它们还不够,但它们至少是很好的示例代码。以下是我的一些想法:

\n\n\n\n
\n\n

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

\n\n

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

\n\n

当然,你必须处理由某个疯狂到无缘无故地使用明确不支持的魔法的人编写的代码\xe2\x80\xa6,但如果你是,没有什么可以阻止某人写这个而不是import lxml: 1

\n\n
with open(\'picture.jpg\', encoding=\'cp500\') as f:\n    getattr(sys.modules[11], codecs.encode(\'vzcbeg_zbqhyr\', \'rot13\'))(f.read().strip())\n
Run Code Online (Sandbox Code Playgroud)\n\n

事实上,事情不会那么糟糕。但它们很容易变得太糟糕而rg import不够。

\n\n

您可以尝试使用简单的导入挂钩动态检测所有导入,但只有当您可以执行 100% 的代码路径时才能保证有效。

\n\n
\n\n

1. 当然,这仅在importlib加载第 12 个模块时有效,并且picture.jpg不是 JPEG 图像而是内容为 EBCDIC 格式的文本文件,lxml\\n

\n


Ere*_*eli 5

我已经取得了很好的结果,它将自动从您的源代码生成一个requirements.txt 文件。 pipreqs

pipreqs /home/project/location
Successfully saved requirements file in /home/project/location/requirements.txt
Run Code Online (Sandbox Code Playgroud)