python - 捕获子进程输出但不向控制台打印任何内容?
问题描述
我正在尝试使用子进程运行 curl 命令。工作正常。我在变量中得到了我需要的输出。我唯一想要的是当进程运行时,我不希望在控制台中打印:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 255 100 153 100 102 56 37 0:00:02 0:00:02 --:--:-- 56
这是脚本的那部分的样子:
import subprocess
def F_createSingleTable(table_name):
un = "test"
pw = "testpass"
url = "https://blah.fake.url.com:7877/services/createstable"
size = "10"
size_til_archive = "30"
retention = "5"
curl_call =\
[\
'curl', \
'-k', \
'-u', \
(un)+":"+(pw), \
(url), \
'-d', \
'name='+(table_name), \
'-d', \
'size='+(size), \
'-d', \
'size_til_archive='+(size_til_archive), \
'-d', \
'retention='+(retention)\
]
process = subprocess.run((curl_call), check=True, stdout=subprocess.PIPE, universal_newlines=True)
output = process.stdout
if "already exists" in (output):
print("table: "+(table_name)+" already exists")
如果重要的话,我得到的实际响应存储在输出中是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<messages>
<msg type="ERROR">table_name table already exists</msg>
</messages>
</response>
我不需要保存它,只需检查“已经存在”是否在其中。我拥有并且可以使用。
谢谢
注意:我最初想使用 subprocess.call 但我似乎无法捕获输出以检查响应中是否已存在
解决方案
您在控制台上看到的是标准错误,而不是标准输出。在正常模式下,curl 将获取的内容打印到 stdout 并将传输统计信息打印到 stderr。您可以使用-s
/标志抑制统计信息,也可以通过传递给子进程调用来--silent
丢弃 stderr 。stderr=subprocess.DEVNULL
如果您关心 stderr 输出,您还可以通过将其传递stderr=subprocess.PIPE
或合并到 stdout 流中来单独捕获它(对于问题中的特定用例,显然不推荐)stderr=subprocess.STDOUT
。