Python subprocess.call函数不重定向输出

Python subprocess.call函数不重定向输出,python,linux,bash,shell,Python,Linux,Bash,Shell,我正在尝试从python文件中运行一个名为nn.sh(随着时间的推移不断运行Linux命令)的shell脚本。我使用的代码如下: from subprocess import call, Popen, PIPE call(['/bin/sh', 'nn.sh', '172.20.125.44', '10', '>>', 'log.txt']) 此代码应使用输入运行nn.sh,并将结果存储在文件log.txt中。当我运行这个Python脚本时,它只在屏幕上显示运行nn.sh的结果,而

我正在尝试从python文件中运行一个名为
nn.sh
(随着时间的推移不断运行Linux命令)的shell脚本。我使用的代码如下:

from subprocess import call, Popen, PIPE
call(['/bin/sh', 'nn.sh', '172.20.125.44', '10', '>>', 'log.txt'])
此代码应使用输入运行
nn.sh
,并将结果存储在文件
log.txt
中。当我运行这个Python脚本时,它只在屏幕上显示运行
nn.sh
的结果,而不会将它们保存在fill
log.txt
中。但是,如果我输入

/bin/sh nn.sh 172.20.125.44 10 >> log.txt

在命令行中,它正确地将所有数据保存到文件
log.txt
。有什么问题吗?

您不能在子流程调用中使用
>
,而是使用
stdout
参数:

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

/
作为
用于日志文件非常感谢!你的评论真的很有帮助。谢谢@AntonSavin指出这一点。我这样做了。我是Stackoverflow的新手。subprocess.call正在帮您转义序列。考虑用户输出文件名的情况,用户给出文件名<代码>“Out.txt;RM- Rf*< /代码>”。如果subprocess.call只是将其按原样转储到shell中,那么您将面临一场灾难。安东·萨文在下面概述了正确的解决方案。但是,请注意,您可以通过传递subprocess.call
shell=True
来强制subprocess.call不转义任何内容,尽管这是一个安全问题,并且被认为是一个糟糕的做法。谢谢@RyanHaining!帮助我了解发生了什么事!