2012-02-17 6 views
8

Se creo un nuovo subprocess in python con un determinato comando (diciamo che avvio l'interprete python con il comando python), come posso inviare nuovi dati al processo (tramite STDIN)?Mantieni un sottoprocesso attivo e continua a dargli comandi? Python

+1

se si tratta di un guscio che si vuole automatizzare l'interazione con, 'pexpect' è grande per questo genere di cose. – wim

risposta

8

Utilizzare il modulo standard subprocess. Si utilizza subprocess.Popen() per avviare il processo e verrà eseguito in background (ad esempio nello stesso momento del programma Python). Quando chiami Popen(), probabilmente vuoi impostare i parametri stdin, stdout e stderr in subprocess.PIPE. Quindi è possibile utilizzare i campi stdin, stdout e stderr sull'oggetto restituito per scrivere e leggere i dati.

codice di esempio testato:

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

Quindi diciamo che ho bisogno di più processi in esecuzione contemporaneamente. È un'idea migliore generare molti sottoprocessi con 'Popen()' o 'fork'? – n0pe

+1

Popen esegue il fork dei processi. È solo una questione di se vuoi fare la forcella di basso livello da te o se vuoi che sia racchiusa in una libreria di livello superiore. Il risultato finale è esattamente lo stesso. –

+0

Quindi molti pop-up simultanei non imperversano sul sistema? Grazie, farò un tentativo. – n0pe

0

Un tunnel creato da Sottoprocesso per attivare più comandi non può essere mantenuto attivo. per ottenere questo puoi guardare in paramiko, per altre cose come lo stdin di sottoprocesso, stdout, stderr puoi passare attraverso questo link python subprocess, poiché questo è il tuo primo progetto python è meglio che tu legga e provi cose.

3

No.

Se si desidera inviare comandi a un sottoprocesso, creare una pty e quindi eseguire il fork del sottoprocesso con un'estremità della pty associata al relativo STDIN.

Ecco un frammento da alcuni del mio codice:

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) 

In questo codice, il PTY è collegato a stderr perché riceve messaggi di errore, piuttosto che l'invio di comandi, ma il principio è lo stesso.

+1

Non utilizzare pty.openpty() con un sottoprocesso: è troppo complesso. Utilizza subprocess.PIPE e lascia che il modulo subprocess si occupi di esso per te. (Oltre ad essere più semplice e più standard, userà un tubo, che è più leggero di un PTY). – user9876