【问题标题】:subprocess python - non zero exception子进程python - 非零异常
【发布时间】:2015-10-01 11:32:49
【问题描述】:

我想为我的 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)。

【问题讨论】:

  • 从终端直接运行该命令时是否遇到任何错误?
  • @AnandSKumar 不,它工作正常
  • ruby wpscan.rb --url www.mywebsite.de --enumerate vp --enumerate vt - 完美运行
  • 什么是PATH变量?
  • config.ini [PATHS] 路径 = ./wpscan

标签: python subprocess


【解决方案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 将为您提供一个元组,其中包含您的命令返回的文本,无论是否出错。

【讨论】:

  • 酷,谢谢 :) 嗯,但为什么它有一个错误?我使用正确的一切:/
  • 我猜测,我认为 Python 正在运行不同的环境变量。这意味着它无法仅通过名称找到ruby。尝试使用指向 Ruby 可执行文件所在位置的确切路径作为第一个参数,看看是否会有所不同。
  • 但是如果找不到 ruby​​,它永远不会执行代码,但它执行 wpscan,最后我得到了异常
  • 您确定它执行了它还是因为脚本继续运行而假设它执行了?子进程中的错误实际上不会像 Python 中的异常通常那样中断脚本,如果这是您的想法的话。
  • 如果我使用 subprocess.call 我会在命令行中看到完整的代码。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2020-10-24
    • 2017-12-29
    • 2018-04-24
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多