簡體   English   中英

僅從subprocess.check_output獲取stderr輸出

[英]Get only stderr output from subprocess.check_output

我想在python中運行外部進程,並僅處理其stderr

我知道我可以使用subprocess.check_output ,但是如何將stdout重定向到/dev/null (或以任何其他方式忽略它),並且僅接收stderr

不幸的是,您已經標記了此 ,就像在python 3.5中一樣,使用run()可以很簡單:

import subprocess

output = subprocess.run(..., stdout=subprocess.DEVNULL,
                        stderr=subprocess.PIPE).stderr

使用check_output()無法直接重定向標准輸出:

>>> subprocess.check_output(('ls', 'asdfqwer'), stdout=open(os.devnull, 'wb'), stderr=subprocess.STDOUT)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 566, in check_output
    raise ValueError('stdout argument not allowed, it will be overridden.')
ValueError: stdout argument not allowed, it will be overridden.

使用Popen對象並在python版本低於3.5的情況下使用communicate() 在python 2.7中使用os.devnull打開/dev/null

>>> import subprocess
>>> import os
>>> with open(os.devnull, 'wb') as devnull:
...     proc = subprocess.Popen(('ls', 'asdfqwer'),
...                             stdout=devnull,
...                             stderr=subprocess.PIPE)
...     proc.communicate()
...     proc.returncode
... 
(None, "ls: cannot access 'asdfqwer': No such file or directory\n")
2

Communicate將輸入發送到stdin(如果已通過管道傳輸),並從stdout和stderr讀取,直到到達文件末尾。

我發現了一個簡單的技巧:

import subprocess
stderr_str = subprocess.check_output('command 2>&1 >/dev/null')

這將濾除標准輸出,並僅保留標准錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM