在命令行上针对不存在的域运行curl时,我收到预期的错误消息
$ curl https://doesnoexist.test/
curl: (6) Could not resolve host: doesnoexist.test
但是如果我在 Python 中做同样的事情,打印标准错误
import subprocess
proc = subprocess.Popen(['curl', 'https://doesnoexist.test/'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outs, errs = proc.communicate()
print(errs)
然后我开始看到似乎是下载进度指示器,然后紧接着出现相同的错误消息
$ python curl.py
b' % Total % Received % Xferd Average Speed Time Time Time
Current\n Dload Upload Total Spent
Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:--
--:--:-- --:--:-- 0curl: (6) Could not resolve host: doesnoexist.test\n'
为什么?如何在Python中只获取错误消息?
(理想情况下,答案不仅适用于curl,而且更普遍,在运行其他进程时会发生类似的事情)
要抑制进度信息并仅捕获错误消息,您可以将
--silent
和 --show_errors
选项添加到 curl
命令:
import subprocess
proc = subprocess.Popen(['curl', '--silent', '--show-error', 'https://doesnoexist.test/'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outs, errs = proc.communicate()
print(errs.decode('utf-8'))
输出:
curl: (6) Could not resolve host: doesnoexist.test
类似的选项可能可用于相同用例的其他命令行实用程序(当不直接通过终端运行时)。