【问题标题】:How to check if all modules imported by a Python script are installed without running the script?如何在不运行脚本的情况下检查是否安装了 Python 脚本导入的所有模块?
【发布时间】:2013-02-18 11:32:57
【问题描述】:

我想在实际运行脚本之前检查是否安装了脚本导入的所有模块,因为脚本非常复杂并且通常运行多个小时。此外,它可能会根据传递给它的选项导入不同的模块,因此仅运行一次可能无法检查所有内容。所以,我不希望在新系统上运行这个脚本几个小时,却因为缺少模块而在完成之前看到它失败。

显然,pyflakes 和 pychecker 在这里没有帮助,如果我错了,请纠正我。我可以这样做:

$ python -c "$(cat *.py|grep import|sed 's/^\s\+//g'|tr '\n' ';')"

但它不是很健壮,例如,如果“import”这个词出现在字符串中,它就会中断。

那么,我怎样才能正确地完成这项任务呢?

【问题讨论】:

  • 简单的解决方案是将您的 grep 更改为 grep '^\s*import',因为没有 Python 行可能以 import 开头(如果我错了,请纠正我)。
  • stackoverflow.com/questions/2875232/… 可能是相关的。特别是:furius.ca/snakefood 看起来就像你想要的一样
  • @FakeRainBrigand from <module> import <stuff> 呢?不,任何基于正则表达式的解决方案都太脆弱了。最好的方法是在 AST 级别工作,而不是文本级别,这是我之前评论中链接的蛇食所做的(或至少声称,从未尝试过)
  • 谢谢,你是对的。我还建议您导入自己并创建一个 requirements.txt 文件,该文件允许您简单地运行 pip install 并立即获取所有依赖项。
  • @FakeRainBrigand 非常感谢有关 requirements.txt 的提示,这是真正可以做的最好的事情,但是我经常处理其他人没有要求的模块/脚本。 txt,因此使用 modulefinder 的解决方案似乎是最好的。

标签: python deployment


【解决方案1】:

您可以使用标准库 modulefinder 中的 ModuleFinder 使用docs中的示例

from modulefinder import ModuleFinder
finder = ModuleFinder()
finder.run_script('bacon.py')

print 'Loaded modules:'
for name, mod in finder.modules.iteritems():
    print '%s: ' % name,
    print ','.join(mod.globalnames.keys()[:3])

print '-'*50
print 'Modules not imported:'
print '\n'.join(finder.badmodules.iterkeys())

【讨论】:

  • 太好了,非常感谢。这似乎正是我所需要的。我不知道modulefinder,尽管它是一个标准模块!
  • 那不运行脚本吗?他明确表示他不想那样做
  • @entropy 不是真的 -> gist.github.com/ephexeve/5081940
  • @BenMezger 啊哈,很好,我猜run_script() 有点误导 :)
【解决方案2】:

您可以编写一个 test.py,其中仅包含所有可能的导入,例如:

import these
import are
import some
import modules

运行它,如果有任何问题 python 会通知你

【讨论】:

  • 感谢您的回答。这是一个很好的方法,唯一的问题是如果这个测试是手动编辑的,那么很容易忘记更新它。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 2020-03-03
  • 2015-08-21
  • 2017-01-27
  • 1970-01-01
  • 2010-10-03
  • 2011-06-26
相关资源
最近更新 更多