导入一个位置未知的python模块

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

第一步,我得到包含模块的目录的path:

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

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

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

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

谢谢!

首先请注意,你不能使用这样的管道! 对于使用pipe你必须传递shell=True所以而不是check_output使用check_output ,也是你的代码失败的path参数find添加/家之前。

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

 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而是使用拖拽命令:

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