subprocess python - 非零异常

时间:2015-07-13 09:07:44

标签: python subprocess

我想为我的python脚本运行subprocess.check_output方法。

try:
        logger.info('Loading URL ' + line)
        wp_output = subprocess.checkout(['ruby', PATH + '/wpscan.rb', '--url', line, '--enumerate',
            'vp', '--enumerate', 'vt'])
        print wp_output
        logger.info(wp_output)
        return wp_output.strip()

    except KeyboardInterrupt:
        raise
    except subprocess.CalledProcessError, e:
        logger.exception('ERROR - Problem occurred while using wpscan.')

例外:

 File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 573, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
CalledProcessError: Command '[u'ruby', u'./wpscan/wpscan.rb', u'--url', 'www.website.de', u'--enumerate', u'vp', u'--enumerate', u'vt']' returned non-zero exit status 1

如果我运行check_output我得到一个非零异常,如果我只使用“subprocess.call”我得到结果“print wp_output”只有int 1 ??

我做错了什么?我想将输出作为字符串(wp_output)。

2 个答案:

答案 0 :(得分:1)

运行subprocess.call时,返回一个表示程序退出代码的int。通常,0表示一切正常,其他数字(例如1)表示错误。

subprocess.check_output会将错误视为python本身的异常,并将其提升,从而产生结果。

如果您希望字符串输出是错误还是成功,请使用Popen

command = ['ruby', PATH + '/wpscan.rb', '--url', line, '--enumerate',
        'vp', '--enumerate', 'vt']
wp_output = subprocess.Popen(command, stdout=subprocess.PIPE)
wp_output = wp_output.communicate()
print wp_output

Popensubprocess.PIPE一起使用,然后在其上运行communicate将为您提供一个元组,其中包含您的命令返回的文本,无论是否是错误。

答案 1 :(得分:0)

这是SuperBiasedMan评论的补充。重定向stderr也会很好,因为错误通常出现在stderr而不是stdout。

command = ['ruby', PATH + '/wpscan.rb', '--url', line, '--enumerate',
    'vp', '--enumerate', 'vt']
wp_proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
wp_output, wp_error = wp_proc.communicate()

if wp_error != '':
    print wp_error
else:
    print wp_output