将shell脚本输出分配给python变量,忽略错误消息

时间:2015-01-27 17:39:57

标签: python bash shell subprocess

我有一个python脚本,我用来调用重命名文件的bash脚本。然后我需要文件的新名称,以便python可以对其进行进一步处理。我正在使用subprocess.Popen来调用shell脚本。 shell脚本回显新文件名,以便我可以使用stdout = subprocess.PIPE来获取新文件名。

问题是,有时bash脚本尝试根据具体情况使用旧名称重命名文件,因此从mv命令中给出两个文件相同的消息。我已经删除了所有其他内容,并在下面提供了一个基本示例。

$ ls -1
test.sh
test.txt

此shell脚本只是强制显示错误消息的示例。

$ cat test.sh
#!/bin/bash
mv "test.txt" "test.txt"
echo "test"

在python中:

$ python
>>> import subprocess
>>> p = subprocess.Popen(['/bin/bash', '-c', './test.sh'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
>>> p.stdout.read()
"mv: `test.txt' and `test.txt' are the same file\ntest\n"

如何忽略mv命令中的消息并仅获取echo命令的输出?如果一切顺利,shell脚本的唯一输出将是echo的结果,所以我只需要忽略mv错误消息。

谢谢,

杰兰特

2 个答案:

答案 0 :(得分:0)

stderr指向null,因此

$ python
>>> import os
>>> from subprocess import *
>>> p = Popen(['/bin/bash', '-c', './test.sh'], stdout=PIPE, stderr=open(os.devnull, 'w'))
>>> p.stdout.read()

答案 1 :(得分:0)

获取子进程的输出并忽略其错误消息:

#!/usr/bin/env python
from subprocess import check_output
import os

with open(os.devnull, 'wb', 0) as DEVNULL:
    output = check_output("./test.sh", stderr=DEVNULL)
如果脚本返回非零状态,

check_output()会引发异常。

请参阅How to hide output of subprocess in Python 2.7