2017-01-03 5 views
0

Вот контекст: Я использую python 2.7.5. И я хотел бы запускать команды UNIX, а также команды maven в сценарии python. Мне это удалось, используя os.system("cmd"), но мне нужно работать над результатом данной команды. После прочтения документа и некоторых потоков здесь я решил использовать модуль подпроцесса для перенаправления вывода на stdout с помощью PIPE. Неожиданно я получаю OSError, как показано на прилагаемом изображении. Ваша помощь будет высоко оценена. В дополнение к данному образцу в прилагаемом изображении, я попытался:Модуль подпроцесса Python, предоставляющий OSError во время выполнения команд UNIX

p = os.popen("java -version") 
result = subprocess.check_output(p, shell=True) 
subprocess.call("ls /usr", shell=True) 
p.s. Using shell=True is strongly discouraged (doc), since it can be dangerous when coupled with unsanitized input. 

Кроме того, я смотрел на данном сценарии в сообщении об ошибке /usr/lib64/python2.7/subprocess.py, line 711 adn 1327 но не узнать больше, чем то, что упоминалось в сообщение об ошибке: raise child_exception Subprocess Terminal Output

ответ

1

Вы не используете subprocess.check_output правильно. Вы пытаетесь передать объект файла pipe (возвращаемое значение os.popen) в check_output, но он ожидает аргумент команды или аргумент vector.

Кроме того, функция subprocess.call не будет записывать вывод выполненной команды, поэтому вы должны использовать ее только в том случае, если вы хотите, чтобы пользователь отображал результат ls /usr (или что-то еще), выполняющий сценарий в интерактивном режиме. (Что в значительной степени так же, как os.system.)

Попробуйте вместо этого (показывать и без оболочки):

import subprocess 

out1a = subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT) 
print(out1a) 

out1b = subprocess.check_output('java -version', stderr=subprocess.STDOUT, shell=True) 
print(out1b) 

out2a = subprocess.check_output(['ls', '/usr']) 
print(out2a) 

out2b = subprocess.check_output('ls /usr', shell=True) 
print(out2b) 

# Cannot capture output this way, but it will be visible to user 
subprocess.call('ls /usr', shell=True) 

Обратите внимание, что в случае команды java -version, информация версия печатается на стандартный вывод ошибки команды, поэтому вы должны перенаправить это, чтобы записать его как возвращаемое значение check_output (отсюда stderr=subprocess.STDOUT).

+0

Спасибо, Gil. теперь команда out1a и ее печать работают. Но как я мог лишить первую строку, так как я хочу проверить, соответствует ли версия определенному числу? Я попытался перенаправить вывод в файл .txt, но не работал. Есть ли команда, которая помогает извлекать и работать непосредственно с выходом терминала? – Mams

+0

В результате вы получите строку, содержащую несколько строк текста. Используйте 'out1a.splitlines()', чтобы разложить это на отдельные строки. Это возвращает «кортеж», из которого вы можете выбрать интересующие вас компоненты. Попробуйте, например, 'print (out1a.splitlines() [0])'. Затем используйте другие строковые методы, чтобы изолировать нужный номер версии (см. Https://docs.python.org/2/library/stdtypes.html?string-methods#string-methods). –

+0

Хорошо, это помогло мне решить мою проблему. Опять же, спасибо Гил. Вот как я завершил: 'import subprocess import re res = subprocess.check_output (['java', '-version'], stderr = subprocess.STDOUT) res2 = res.splitlines() [0] .split () [2] VersionNumber = re.findall ('[0-9 ._] +, res2) печати (VersionNumber) , если VersionNumber [0]> = 1.7: \t печати "Холодный" еще: \t печать «Установить более новую версию» ' – Mams