这是python代码的片段。我想获得curl命令的结果。 (注意:我可以使用请求模块而不是调用curl命令,但由于某些复杂性原因,哪个请求模块没有用完,我最终使用了命令)
我正在使用子进程捕获curl输出并将成功/错误输出存储在stdout和stderr中。在这种情况下,我看到脚本打印成功和失败。但是,最后,我希望获得成功/错误取决于结果,而不是两者。有人可以对这里可能出错的事情说清楚吗
counter = 1
for url in urls:
command = 'curl ' + acceptance_url
args = command.split()
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
if stdout is not None:
print "Success: %s" % (stdout)
if stderr is not None:
print "Error: %s" %(stderr)
答案 0 :(得分:2)
你不应该检查它是否不是无,将其转换为正面表达式:
if stdout:
print "Success: %s" % (stdout)
if stderr:
print "Error: %s" %(stderr)
您还可以查看
Popen.returncode:子返回代码,由poll()和wait()设置(和 间接地通过沟通())。
查看命令是否成功。
答案 1 :(得分:1)
您可以使用subprocess.check_output执行此任务
try:
print( subprocess.check_output(args) )
except subprocess.CalledProcessError as ee:
print(ee.output)
答案 2 :(得分:1)
如果命令失败,则stdout包含空字符串("")而不包含None
。
因此,不要检查None返回,而是检查空字符串。
import subprocess
counter = 1
command = 'curl www.google.com'
args = command.split()
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
if stdout != "":
print "stdout: " + str(stdout)
if stdout == "":
print "stderr: " + str(stderr)
代码输出:
$ python temp.py
stdout: <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.in/?gfe_rd=cr&ei=1LASWeGTCcb38AfshbDoCQ">here</A>.
</BODY></HTML>
$ # curl www.goovadvgle.com
$ python temp.py
stderr: % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0curl: (6) Could not resolve host: www.goovadvgle.com
$