导入位置未知的 Python 模块



我想从python(MOD.py)中的给定模块导入一个函数(function.py),我不知道它的位置。为此,我执行了两个步骤:

第一步,我获取包含模块的目录的路径:

path = subprocess.check_output(['find', 'home/scripts','-iname','MOD.py','|','sed','s//MOD.py//g']).rstrip()

其次,我指向这个目录从模块中获取函数:

sys.path.insert(0,'{0}'.format(path))
from MOD import function

编写的代码在第一步中失败,尤其是在 sed 中。为什么它不起作用?有没有更清晰的方法来完成第一步?是有必要做两个步骤,还是可以用一个python指令来完成?

谢谢!

首先

请注意,你不能像那样使用管道! 要使用pipe你必须传递shell=True所以而不是check_output使用Popen,你的代码在find在家之前添加一个/的参数path失败。

如果执行的命令返回非零退出代码,则会引发异常。 您可以使用带有subprocess.CalledProcessErrortry-except来捕获错误并获取与退出代码一起创建的输出:

import subprocess
try:
    ps = subprocess.Popen(['find', '/home/scripts','-iname','MOD.py','|','sed','s//MOD.py//g'],shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
    path= ps.communicate()[0]
except subprocess.CalledProcessError as e:
     out_bytes = e.output
     code= e.returncode

此外,作为一种更安全的方法,我建议不要使用 shell=True 而是使用 tow 命令:

ps = subprocess.Popen(['find', '/home/scripts','-iname','MOD.py'], stdout=subprocess.PIPE)
path = subprocess.check_output(['sed','s//MOD.py//g'], stdin=ps.stdout)

相关内容

  • 没有找到相关文章

最新更新