我想从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指令执行此操作?
谢谢!
答案 0 :(得分:1)
首先请注意,您不能使用这样的管道!要使用pipe
,您必须通过shell=True
而不是check_output
使用Popen
,而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
而是使用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)