重定向通过python执行的shell脚本的输出

时间:2012-04-16 15:59:53

标签: python

您好我正在尝试使用以下命令从python执行shell脚本。

os.system("sh myscript.sh")

在我的shell脚本中我写了一些SOP,现在如何在我的Python中获取SOP以便我可以将它们记录到某个文件中?

我知道使用subprocess.Popen我可以这样做,因为某些原因我无法使用它。

p=subprocess.Popen(
        'DMEARAntRunner \"'+mount_path+'\"',
         shell=True,
         stdout=subprocess.PIPE,
         stderr=subprocess.STDOUT
)
while 1:
    line=p.stdout.readline()[:-1]
    if not line:
        break
    write_to_log('INFO',line)
    p.communicate()

3 个答案:

答案 0 :(得分:1)

我个人建议您将shell参数保留为默认值False。在这种情况下,第一个参数不是你输入终端的字符串,而是一个“单词”列表,第一个是程序,后面是参数。这意味着不需要引用参数,使您的程序更容易适应空白参数和injection attacks

这应该可以解决问题:

p = subsprocess.Popen(['DMEARAntRunner', mount_path], 
    stdout=subprocess.PIPE,stderr=subprocess.STDOUT)

与执行shell命令一样,问题仍然是它是否是解决问题的最简单/最好的方法,但这是另一个完全的讨论。

答案 1 :(得分:1)

请检查使用python中的子进程模块的official documentation。目前,这是os.system调用执行系统函数和检索结果的推荐方法。上面的链接提供了非常接近您需要的示例。

答案 2 :(得分:1)

如果我理解你的问题,你需要这样的东西:

import subprocess
find_txt_command = ['find', '-maxdepth', '2', '-name', '*.txt']
with open('mylog.log', 'w') as logfile:
    subprocess.call(find_txt_command, stdout=logfile, shell=False)

如果需要,可以使用Popen代替调用,语法非常相似。请注意,命令是包含要运行的进程和参数的列表。一般来说,你想使用shell = False的Popen / call,它可以防止难以调试的意外行为,并且它更具可移植性。