2015-01-13 2 views
19

это мои питона коды:питон подпроцесс check_output возвращается ненулевое состояние выхода 1

import subprocess 
subprocess.check_output("ls",shell=True,stderr=subprocess.STDOUT) 

import subprocess 
subprocess.check_output("yum",shell=True,stderr=subprocess.STDOUT) 

первая работа хорошо, но второй возврат:

Traceback (most recent call last): 
File "/usr/lib/x86_64-linux-gnu/gedit/plugins/pythonconsole/console.py", line 378, in __run 
r = eval(command, self.namespace, self.namespace) 
File "<string>", line 1, in <module> 
File "/usr/lib/python3.4/subprocess.py", line 616, in check_output 
raise CalledProcessError(retcode, process.args, output=output) 
subprocess.CalledProcessError: Command 'yum' returned non-zero exit status 1 

почему это происходит? заключается в том, что поскольку ls является исходной командой оболочки, но yum является новым пакетом? Как решить эту проблему?

ответ

14

Команда yum, которую вы запускали, была выполнена должным образом. Он возвращает ненулевой статус, что означает, что во время обработки команды произошла ошибка. Вероятно, вы хотите добавить какой-либо аргумент в команду yum, чтобы исправить это.

Ваш код может показать эту ошибку так:

import subprocess 
try: 
    subprocess.check_output("dir /f",shell=True,stderr=subprocess.STDOUT) 
except subprocess.CalledProcessError as e: 
    raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) 
+0

поэтому, если я просто хочу реализовать команду (g3-from-scratch.csh tpall.fna с нуля) в python. Эта команда создаст некоторые файлы в текущем каталоге, но не даст ответа в консоли, я проверю эту команду в оболочке, она работает. как я могу реализовать его в python? Первоначально я использую os.system(), но он просто возвращает (sh: 1: g3-from-scratch.csh: не найден) –

+0

Вы прочитали это: https: // docs. python.org/3.4/library/subprocess.html – Plouff

+0

Я пробую ваш код для yum, он работает хорошо, но не для g3-from-scratch.csh. Я не понимаю, что с ними связано, я могу использовать их непосредственно в консоли. –

6

Слово check_ в названии означает, что если команда (оболочка в этом случае возвращает статус выхода последней команды (yum в этом case)) возвращает ненулевой статус, тогда он вызывает исключение CalledProcessError. Это по дизайну. Если команда, которую вы хотите запустить, может вернуть ненулевой статус при успешном завершении, либо поймать это исключение, либо не использовать методы check_. Вы можете использовать subprocess.call в вашем случае, потому что вы не обращая внимания на захваченный выход и т.д .:

import subprocess 

rc = subprocess.call(['grep', 'pattern', 'file'], 
        stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) 
if rc == 0: # found 
    ... 
elif rc == 1: # not found 
    ... 
elif rc > 1: # error 
    ... 

Вам не нужно shell=True запускать команды из вашего вопроса.

+0

Итак, вы все равно проверяете код возврата после 'subprocess.call'. Есть ли реальный случай, когда вы должны использовать 'call' вместо' check_output' отдельно от сценария команды с недопустимым кодом возврата? Спасибо! – Plouff

+0

Исключения должны быть подняты только в исключительных случаях (есть исключения, но общее правило выполняется). Если вы ожидаете, что 'grep' вернет' 1' (если это не ошибка в вашем приложении), вы не должны возбуждать исключение. Статус выхода проверяется, чтобы узнать, найден ли шаблон в файле: в первую очередь это процесс запуска дочернего процесса. Кроме того, вы не должны использовать 'check_output()', если вы не используете его возвращаемое значение (выход из подпроцесса) – jfs

+0

Благодарим вас за объяснения. Я понимаю идею с «grep», но это все еще не так очевидно для меня. Я только что задал вопрос: http://stackoverflow.com/q/27938050/882697. Не могли бы вы посмотреть? Еще раз спасибо! – Plouff

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