【问题标题】:python 2 subprocess check_output not returning error outputpython 2子进程check_output不返回错误输出
【发布时间】:2015-09-25 21:43:59
【问题描述】:

我有这个方法

def do_sh_shell_command(string_command, env_variables=None):
    cmd = shlex.split(string_command)
    try:
       p = subprocess.check_output(string_command, shell=True,
                                   env=env_variables) # shell=True means sh shell used 
    except subprocess.CalledProcessError as e:
        print 'Error running command: ' + '"' + e.cmd + '"' + ' see above shell error'
        print 'Return code: ' + str(e.returncode)
        return e.returncode, e.cmd
    return 0, p

哪个有效,但由于某种原因不会从特定命令返回错误输出

def hold_ajf_job(job_order_id):
    #print 'ctmpsm -UPDATEAJF ' + job_order_id + ' HOLD'
    return do_sh_shell_command('ctmpsm -UPDATEAJF ' + job_order_id + ' HOLD')

hold_ajf_job('0e4ba')
do_sh_shell_command('lsl')

输出:

ctmpsm -UPDATEAJF 0e4ba HOLD
Error running command: "ctmpsm -UPDATEAJF 0e4ba HOLD" see above shell error
Return code: 1
/bin/sh: lsl:  not found
Error running command: "lsl" see above shell error
Return code: 127

当我运行命令 ctmpsm -UPDATEAJF 0e4ba HOLD 只是形成正常的外壳时,我得到以下错误输出

ctmtest1-tctmsv80 [288] ctmpsm -UPDATEAJF 0e4ba HOLD
Failed to Hold Orderno 0000e4ba. (rc=JOBSTATINCM).

这与我的 python 代码中的无用错误输出不同,我终生无法弄清楚为什么?

更新:

尝试 stderr=subprocess.STDOUT

def do_sh_shell_command(string_command, env_variables=None):
    cmd = shlex.split(string_command)
    try:
       p = subprocess.check_output(string_command, stderr=subprocess.STDOUT, shell=True,
                                   env=env_variables) # shell=True means sh shell used 
    except subprocess.CalledProcessError as e:
        print 'Error running command: ' + '"' + e.cmd + '"' + ' see above shell error'
        print 'Return code: ' + str(e.returncode)
        return e.returncode, e.cmd
    return 0, p

输出:

Error running command: "ctmpsm -UPDATEAJF 0e4ba HOLD" see above shell error
Return code: 1
Error running command: "lsl" see above shell error
Return code: 127

现在错误已经完全消失了?

【问题讨论】:

  • 不相关:cmd 在您的代码中未使用。

标签: python python-2.7 subprocess


【解决方案1】:

作为documented,当check_output 引发异常时,它会将命令的输出放在异常对象的output 属性中。您可以执行以下操作:

try:
    p = subprocess.check_output(string_command, stderr=subprocess.STDOUT,
                                shell=True, env=env_variables)
except subprocess.CalledProcessError as e:
    print e.output
    print 'Error running command: ' + '"' + e.cmd + '"' + ' see above shell error'
    print 'Return code: ' + str(e.returncode)
    return e.returncode, e.cmd
return 0, p

【讨论】:

    【解决方案2】:

    通过指定stderr=subprocess.STDOUT,可以使写入标准错误的输出重定向到标准输出。

    p = subprocess.check_output(
        string_command,
        shell=True,
        stderr=subprocess.STDOUT,
        env=env_variables)
    

    【讨论】:

    • 感谢虚假的回复。我已经尝试过了,它似乎删除了我的所有输出:请参阅帖子中的更新
    • @JustinS,在subprocess.check_output 通话后尝试print(p)
    • @JustinS,如果您只想让程序输出到终端而不是捕获输出,请使用subprocess.call:subprocess.call(string_command, shell=True, env=env_variables)
    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2017-03-19
    • 2012-05-21
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多