2012-02-17 6 views
8

Jeśli odradzam nowe subprocess w pythonie za pomocą danego polecenia (powiedzmy, że uruchamiam interpretera python za pomocą komendy python), w jaki sposób mogę wysłać nowe dane do procesu (przez STDIN)?Utrzymaj subproces przy życiu i podawaj mu polecenia? Python

+1

czy jest to powłoka chcesz zautomatyzować interakcji z 'pexpect' jest dobre dla tego rodzaju rzeczy. – wim

Odpowiedz

8

Użyj standardowego modułu subprocess. Używasz podprocesu.Popen(), aby rozpocząć proces, i będzie on działał w tle (to znaczy w tym samym czasie, co program Python). Kiedy wywołujesz Popen(), prawdopodobnie chcesz ustawić parametry stdin, stdout i stderr w podprocesie.PIPE. Następnie możesz użyć pól stdin, stdout i stderr zwróconego obiektu do zapisu i odczytu danych.

Nietestowane przykładowy kod:

from subprocess import Popen, PIPE 

# Run "cat", which is a simple Linux program that prints it's input. 
process = Popen(['/bin/cat'], stdin=PIPE, stdout=PIPE) 
process.stdin.write(b'Hello\n') 
process.stdin.flush() 
print(repr(process.stdout.readline())) # Should print 'Hello\n' 
process.stdin.write(b'World\n') 
process.stdin.flush() 
print(repr(process.stdout.readline())) # Should print 'World\n' 

# "cat" will exit when you close stdin. (Not all programs do this!) 
process.stdin.close() 
print('Waiting for cat to exit') 
process.wait() 
print('cat finished with return code %d' % process.returncode) 
+0

Załóżmy, że potrzebuję kilku procesów działających jednocześnie. Czy lepiej jest odradzać wiele podprocesów za pomocą 'Popen()' lub 'fork'? – n0pe

+1

Popen rozwidla procesy. To tylko kwestia, czy sam chcesz zrobić widelec o niskim poziomie, czy też chcesz go zawinąć w bibliotece wyższego poziomu. Wynik końcowy jest dokładnie taki sam. –

+0

A więc kilka równoczesnych Popensów nie obciąży systemu? Dzięki, spróbuję. – n0pe

0

Tunel utworzony przez Podproces do wystrzelenia wielu poleceń nie może być utrzymywany przy życiu. do osiągnięcia tego możesz zajrzeć do paramiko, do innych rzeczy, takich jak podproces stdin, stdout, stderr możesz przejść przez ten link python subprocess, ponieważ jest to twój pierwszy projekt Pythona, lepiej jest czytać i wypróbowywać rzeczy.

3

Nie.

Jeśli chcesz wysłać polecenia do podprocesu, utwórz pty, a następnie podpnij podproces z jednym końcem pty dołączonym do jego STDIN.

Oto urywek z niektóre z moich kodu:

RNULL = open('/dev/null', 'r') 
WNULL = open('/dev/null', 'w') 

master, slave = pty.openpty() 
print parsedCmd 
self.subp = Popen(parsedCmd, shell=False, stdin=RNULL, 
         stdout=WNULL, stderr=slave) 

W tym kodzie PTY jest dołączony do stderr ponieważ odbiera komunikaty o błędach zamiast wysyłania poleceń, ale zasada jest taka sama.

+1

Nie używaj pty.openpty() z podprocesorem - to zbyt skomplikowane. Użyj podprocesu.PIPE i pozwól, aby moduł podprocesu zajął się nim za ciebie. (Oprócz tego, że jest prostszy i bardziej standardowy, użyje rury, która jest lżejsza niż PTY). – user9876

Powiązane problemy