Python捕获子进程中的成功或失败

时间:2017-05-10 05:49:06

标签: python curl

这是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)

3 个答案:

答案 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&amp;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

$