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

Assign shell script output to python variable ignoring error messages

我有一个 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 错误消息。

谢谢,

杰兰特

直接stderr为空,因此

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

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

#!/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)
如果脚本 returns 具有非零状态,

check_output() 会引发异常。

参见How to hide output of subprocess in Python 2.7