我正在尝试使用子进程运行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>
我不需要保存它,只需检查其中是否存在“ alredy”。我拥有并可以使用。
谢谢
注意:我本来想使用subprocess.call,但似乎无法捕获输出以检查响应中是否已存在
您在控制台上看到的是stderr,而不是stdout。在正常模式下,curl将获取的内容打印到stdout,并将传输状态打印到stderr。您可以使用-s
/ --silent
标志取消统计信息,也可以通过将stderr=subprocess.DEVNULL
传递给子进程调用来丢弃stderr。
如果您关心stderr输出,也可以通过传递stderr=subprocess.PIPE
来分别捕获它,或者通过传递stderr=subprocess.STDOUT
将其合并到stdout流中(显然,对于该问题的特定用例不建议这样做)。
capture_output
方法的subprocess.run
参数默认情况下为False
,如果要使其将输出捕获到True
属性中,则必须将其设置为stdout
:
process = subprocess.run(curl_call, capture_output=True, check=True, universal_newlines=True)