如何检查Python脚本导入的所有模块是否在未运行脚本的情况下安装?

如何检查Python脚本导入的所有模块是否在未运行脚本的情况下安装?,python,deployment,Python,Deployment,我想在实际运行脚本之前检查脚本导入的所有模块是否都已安装,因为脚本非常复杂,通常运行数小时。此外,它可能会根据传递给它的选项导入不同的模块,因此仅运行一次可能不会检查所有内容。所以,我不想在一个新系统上运行这个脚本几个小时,却看到它在完成之前因为缺少一个模块而失败 显然,pyflakes和pychecker在这里没有帮助,如果我错了,请纠正我。我可以这样做: $ python -c "$(cat *.py|grep import|sed 's/^\s\+//g'|tr '\n' ';')" 但

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

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

$ python -c "$(cat *.py|grep import|sed 's/^\s\+//g'|tr '\n' ';')"
但它不是很健壮,例如,如果单词“import”出现在字符串中,它就会中断


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

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

import these
import are
import some
import modules

运行它,如果有任何问题,python会让您知道

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

import these
import are
import some
import modules
运行它,如果有任何问题,python会告诉您

您可以使用标准lib ModuleFinder中的ModuleFinder 使用来自

您可以使用标准库ModuleFinder中的ModuleFinder 使用来自



简单的解决方案是将grep更改为
grep'^\s*import'
,因为任何Python行都不能以import开头(如果我错了,请纠正我)。可能是相关的。特别是:看起来它做了你想做的事情want@FakeRainBrigand导入的
如何?不,任何基于正则表达式的解决方案都太脆弱。最好的方法是在AST级别工作,而不是文本级别,这是snakefood在我之前的评论中所做的(或者至少声称从未尝试过)谢谢,你是对的。我还建议您自己完成导入并创建一个文件,该文件允许您只需运行
pip install
,即可获得所有依赖项。@Fakerainbrigan非常感谢requirements.txt上的提示,这是您能做的最好的事情,但是,我经常处理其他人没有requirements.txt的模块/脚本,因此使用modulefinder的解决方案似乎是最好的。简单的解决方案是将grep更改为
grep'^\s*import'
,因为没有Python行可以以import开头(如果我错了,请纠正我)。可能是相关的。特别是:看起来它做了你想做的事情want@FakeRainBrigand导入的
如何?不,任何基于正则表达式的解决方案都太脆弱。最好的方法是在AST级别工作,而不是文本级别,这是snakefood在我之前的评论中所做的(或者至少声称从未尝试过)谢谢,你是对的。我还建议您自己完成导入并创建一个文件,该文件允许您只需运行
pip install
,即可获得所有依赖项。@Fakerainbrigan非常感谢requirements.txt上的提示,这是您能做的最好的事情,但是,我经常处理其他人没有requirements.txt的模块/脚本,因此使用modulefinder的解决方案似乎是最好的。太好了,非常感谢。这似乎正是我需要的。我不知道
modulefinder
,即使它是一个标准模块!那不是运行脚本吗?他明确表示他不想这样做that@entropy不是真的->gist.github.com/ephexeve/5081940@BenMezger啊哈,很好,我想
run\u script()
有点误导:)太好了,非常感谢。这似乎正是我需要的。我不知道
modulefinder
,即使它是一个标准模块!那不是运行脚本吗?他明确表示他不想这样做that@entropy不是真的->gist.github.com/ephexeve/5081940@BenMezger啊哈,很好,我想
run\u script()
有点误导:)谢谢你的回答。这是一个很好的方法,唯一的问题是如果这个测试是手动编辑的,那么很容易忘记更新它。谢谢你的回答。这是一个很好的方法,唯一的问题是如果这个测试是手动编辑的,那么很容易忘记更新它。