重定向subprocess.call输出不起作用

时间:2017-03-11 02:31:13

标签: python shell unix redirect grep

我正在尝试编写一个python脚本,它充当简单的UNIX bash命令shell。我需要阻止脚本的所有输出并将其重定向到两个文件之一(错误或输出)。不幸的是,当在目录上运行我的bash命令时,我得到输出“grep:test_dir:是一个目录”。这是在将我的sys.stdout重定向到临时文件之后。我的理论是grep本身正在重置输出并打印此错误,而不是简单地返回输出。有没有办法可以将任何和所有输出重定向到文件?或者我只是误解了如何在python中重定向?

这是我目前的代码。

try:
    temp_out = sys.stdout
    sys.stdout = open('./temp.txt', 'w+')
    output = subprocess.call(['grep', search[0], search[1]])
    sys.stdout = temp_out
except subprocess.CalledProcessError as err:
    print output
    err_output = err.returncode
    print "In error"

2 个答案:

答案 0 :(得分:1)

不要替换sys.stdout;打开普通文件并将其作为stdout参数传递。

with open('destination.txt', 'w') as redirected_output:
  p = subprocess.Popen(['ls', '-l'], stdout=redirected_output)
  p.communicate()

为我工作。

答案 1 :(得分:0)

来自Python doc

  

stdout用于print()和expression语句的输出以及input()的提示;

我的猜测是它不适用于子流程。

一种方法:

p = subprocess.Popen(['grep', search[0], search[1]], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
sys.stdout.write(out) # you have to decode byte to str if it's Python3
sys.stderr.write(err)