我想从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.CalledProcessError
的try-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)