我有一个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错误消息。
谢谢,
杰兰特
答案 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()
会引发异常。