我正在尝试编写一个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"
答案 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)