2012-05-04 2 views
1

У меня есть скрипт python, который вызывает скрипт bash. Сценарий bash компилирует несколько модулей, и я хотел бы получить результат компиляции, напечатанной на экране во время работы.вызов bash из python

Главное, во всяком случае, в том, что для сценария bash требуется время выполнения всего нескольких входных данных от пользователя. Как я могу заставить свой скрипт python давать stdin/stdout скрипту bash?

На данный момент я использую

(_stat, _resl) = commands.getstatusoutput("./myBashScript") 

, но в этом случае пользователь не promped ничего в то время как Баш работает ...

Приветствия

ответ

3

Если вы используете subprocess (как и следовало!) И не указывайте stdin/stdout/stderr, они будут работать нормально. Например:

# lol.py 
import subprocess 
p = subprocess.Popen(['cat']) 
p.wait() 

$ python lol.py 
hello 
hello 
catting 
catting 

Вы также могли бы обрабатывать stdout, как вам нравится:

# lol.py 
import subprocess 

p = subprocess.Popen(['cat'], stdout=subprocess.PIPE) 
p.wait() 

print "\n\nOutput was:" 
print p.stdout.read() 

$ python lol.py 
hello 
catting 

^D 

Output was: 
hello 
catting 
+0

Не могли бы вы подробно остановиться на «как должны»? Я хотел бы знать, является ли «подпроцесс» хорошим выбором для моей ситуации. Я не прошу о всеобъемлющем эссе, но знание того, почему вы думаете, что OP должно использовать «подпроцесс» в его ситуации, поможет. – LarsH

+0

@LarsH Я просто имел в виду, что 'subprocess' теперь является предпочтительным модулем для любого процесса-вызова, а не' команд', 'os.popen',' os.system' и т. Д. – Dougal

+0

ОК, спасибо, вот что Я искал. – LarsH

0

Вы можете использовать операционную систему. система открывает для этого окно терминала, например gnome-terminal, для запуска сценария bash.

1

Попробуйте envoy library.

import envoy 
r = envoy.connect('./myBashScript') 
r.send('input text') # send info on std_in 
r.expect('output text') # block until text seen 
print r.std_out # print whatever is in the std_out pipe 
Смежные вопросы