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

时间:2014-11-20 17:03:49

标签: python linux sed

我想从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指令执行此操作?

谢谢!

1 个答案:

答案 0 :(得分:1)

首先请注意,您不能使用这样的管道!要使用pipe,您必须通过shell=True而不是check_output使用Popen,而path find参数中的代码也失败了在家之前/

如果执行的命令返回非零退出代码,则引发异常。您可以使用try-exceptsubprocess.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)