Python subprocess.call函数无法重定向输出

4

我想在Python文件中运行一个名为nn.sh的Shell脚本(该脚本会不断地执行Linux命令),我正在使用以下代码:

from subprocess import call, Popen, PIPE
call(['/bin/sh', 'nn.sh', '172.20.125.44', '10', '>>', 'log.txt'])

这段代码应该是运行nn.sh,输入为172.20.125.4410,并将结果存储在文件log.txt中。当我运行此Python脚本时,它只在屏幕上显示运行nn.sh的结果,并未将其保存在log.txt文件中。然而,如果我输入命令:
/bin/sh nn.sh 172.20.125.44 10 >> log.txt

在命令行中,所有数据都被正确保存到了文件log.txt中。你有任何想法吗?这里可能出了什么问题?

subprocess.call正在为您转义序列,这是一种好处。考虑用户提供输出文件名的情况,用户给出文件名“out.txt; rm -rf *”。如果subprocess.call将其原样转储到shell中,那么您将面临灾难。Anton Savin下面概述了正确的解决方案。但是,供您参考,您可以通过传递shell = True来强制subprocess.call不转义任何内容,尽管这是一种安全问题并被认为是不良实践。 - Ryan Haining
谢谢@RyanHaining!帮助我理解了正在发生的事情! - Mohsen Karimzadeh Kiskani
1个回答

4

在子进程调用中,你不能使用>>,而应该使用stdout参数:

with open("log.txt", "at") as log:
    call(['/bin/sh', 'nn.sh', '172.20.125.44', '10'], stdout = log)

1
使用 with/as 来处理日志文件。 - Ryan Haining
非常感谢!你的评论真的很有帮助。 - Mohsen Karimzadeh Kiskani
感谢@AntonSavin指出。我已经这样做了。我是Stackoverflow的新手。 - Mohsen Karimzadeh Kiskani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接