我想从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)