代码之家  ›  专栏  ›  技术社区  ›  Andrew

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

  •  4
  • Andrew  · 技术社区  · 6 年前

    我正在清理一个我没有创建的python项目的打包。目前,它做了一些 explicitly unsupported 从Requirements.txt文件获取其依赖项的魔力。该文件看起来可能是由PIP冻结生成的;对于所有内容都有固定版本,并且列出了许多显然无关的包。我很确定其中的一些不是真正的依赖,但我不知道是哪一个。

    只要给定源代码树,我将如何从头开始计算install\u需要哪些依赖项?

    作为第一步,我将重设非stdlib导入语句。我希望有更好的办法。

    3 回复  |  直到 6 年前
        1
  •  3
  •   abarnert    6 年前

    没办法了 完美 ,因为Python太灵活了。

    但通常可以做得足够好。

    你可以从stdlib的 modulefinder .

    除此之外,许多为Python AppsHAVE构建二进制可执行文件、安装程序等而设计的StudioStudio项目提出了更远的启发式算法。

    这些通常有效。而且,当他们不及格时,你通常会在第一次考试中立即发现。即使它们不够,它们也是最不好的样本代码。下面是我头顶上的几个:


    如果你想知道为什么不可能:

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

    当然,你必须处理那些疯狂到毫无理由地使用显式不受支持的魔法的人编写的代码,但是如果你是,没有什么可以阻止别人写这个而不是 import lxml :

    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

        2
  •  2
  •   Ereli    6 年前

    我已经取得了很好的成绩 pipreqs 它将自动从源代码生成requirements.txt文件。

    pipreqs /home/project/location
    Successfully saved requirements file in /home/project/location/requirements.txt
    
        3
  •  0
  •   HunBurry    6 年前

    我的意思是,最有效的方法就是逐行检查代码,确定哪些包可能不需要,哪些包需要更新,等等。我知道Python2和3都有modulefinder,它可以找到脚本成功编译和运行所需的所有模块,但我以前从未使用过,所以不确定它有多有效,尤其是你在做什么。不过,如果你感兴趣,我会附上下面的链接。

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