2015-07-08 2 views
2

У меня есть этот методпитон 2 подпроцесс не check_output возвращения выход ошибки

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 

, которые работают, но по какой-то причине не возвращает вывод ошибок из specfici команды

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, просто создайте обычную оболочку, я получаю belo ш выход ошибки

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

Это отличается от не-полезный вывод ошибок в моем питона коде, и я не могу за жизнь мне понять, почему?

UPDATE:

Попытка 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 

Теперь ошибки полностью исчезли?

+0

Несвязанный: 'cmd' не используется в вашем коде. – jfs

ответ

5

В 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 
+0

Это работало благодаря помощнику –

0

Указывая stderr=subprocess.STDOUT, вы можете сделать вывод, записанный в стандартную ошибку, перенаправленным на стандартный вывод.

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

спасибо за ответ falsetru. Я пробовал это и, кажется, удаляет весь мой вывод: см. Обновленный в сообщении –

+0

@JustinS, Try 'print (p)' после вызова 'subprocess.check_output'. – falsetru

+0

@JustinS. Если вы просто хотите, чтобы программа выводила на терминал, а не ловила вывод, используйте ['subprocess.call'] (https://docs.python.org/2/library/subprocess.html#subprocess. call): 'subprocess.call (string_command, shell = True, env = env_variables)' – falsetru

Смежные вопросы