2013-08-04 6 views
8

Ho un processo principale in cui eseguo un sottoprocesso, che stdin è quello che voglio pipe. So che posso farlo utilizzando file:Stdin dei tubi sottoprocesso senza utilizzare i file

import subprocess 
subprocess.call('shell command', stdin=open('somefile','mode')) 

C'è qualche possibilità di utilizzare un tubo stdin personalizzato senza effettivi file del disco rigido? C'è qualche opzione, ad esempio, per usare la lista di stringhe (ogni elemento di lista sarebbe una nuova riga)?

So che il sottoprocesso Python chiama .readline() sull'oggetto pipe.

+1

Anche se non necessariamente la risposta alla tua domanda, vale la pena ricordare che qualsiasi sistema operativo compatibile con POSIX supporta l'uso di/dev/stdin come un 'file', questo funziona in tutto il scheda con comandi shell utilizzando un EOF per terminare lo stream. Ho appena verificato ciò usando tcsh e bash su OSX, Linux e OpenBSD. – synthesizerpatel

+0

@synthesizerpatel non è una risposta, ma grazie per un prezioso commento! – ducin

+1

Beh .. In tutta onestà, è ** una ** risposta. Solo ** la ** risposta. : D – synthesizerpatel

risposta

4

Innanzitutto, utilizzare subprocess.Popen - .call è solo una scorciatoia per esso e sarà necessario accedere all'istanza Popen in modo da poter scrivere nella pipe. Quindi passare il flag subprocess.PIPE come stdin kwarg. Qualcosa di simile:

import subprocess 
proc = subprocess.Popen('shell command', stdin=subprocess.PIPE) 
proc.stdin.write("my data") 

http://docs.python.org/2/library/subprocess.html#subprocess.PIPE

+0

È inoltre possibile specificare 'stdin = 0', facendo riferimento anche all'handle del file stdin in base al valore numerico. – synthesizerpatel

+0

@synthesizerpatel er, è una differenza sottile, ma questo sta dicendo al sottoprocesso di utilizzare il processo * genitore * stdin - non quello che è stato chiesto, dove i dati che sono stati reindirizzati erano (nel suo esempio) generati da un elenco di stringhe. A parte questo, mi piacerebbe scoraggiare passando FD-numero-maniglie in generale (così come/dev/stdin'), fatta eccezione e salvo 'proxy' i dati in-processo è troppo dimostrato di essere troppo lento in un punto di riferimento. Il motivo è che lo stdin condiviso, prima o poi, causerà errori quando il processo sbagliato eseguirà la lettura e incasina il flusso di dati per il processo di gestione stdin previsto. – AdamKG

+0

Abbastanza onesto, sentivo solo l'uso del file handle by number. – synthesizerpatel