2013-08-04 11 views
8

Mam główny proces, w którym uruchamiam podproces, którego stdin jest tym, co chcę wyprowadzić. Wiem, że mogę to zrobić, używając plików:Podprocesowe stdin bez użycia plików

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

Czy istnieje opcja użycia niestandardowej rury stdin BEZ rzeczywistych plików na dysku twardym? Czy jest jakaś opcja, na przykład, aby użyć listy ciągów znaków (każdy element listy byłby znakiem nowej linii)?

Wiem, że podprocesor Pythona wywołuje .readline() na obiekcie potoku.

+1

Choć niekoniecznie odpowiedź na swoje pytanie, to warto wspomnieć, że każdy zgodny system operacyjny POSIX obsługuje użycie/dev/stdin jako „Plik”, to działa w poprzek tablica z poleceniami powłoki za pomocą EOF do zakończenia strumienia. Właśnie to zweryfikowałem używając tcsh i bash w systemach OSX, Linux i OpenBSD. – synthesizerpatel

+0

@synthesizerpatel nie jest odpowiedzią, ale dzięki za cenny komentarz! – ducin

+1

Cóż .. W uczciwości to ** ** odpowiedź. Po prostu nie ** ** odpowiedź. : D – synthesizerpatel

Odpowiedz

4

Po pierwsze, użyj subprocess.Popen - .call jest to skrót do niego i musisz uzyskać dostęp do instancji Popen, aby można było pisać do potoku. Następnie prześlij flagę subprocess.PIPE jako kwarg stdin. Coś jak:

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

Można również określić "stdin = 0", odwołując się także do uchwytu pliku stdin za pomocą wartości numerycznych. – synthesizerpatel

+0

@synthesizerpatel er, to subtelna różnica, ale to mówi podprocesowi, aby użył * rodzica * procesu 'stdin - nie tego, co zostało zadane, gdzie dane, które są instalowane, były (w jego przykładzie) generowane z listy łańcuchów. Poza tym zniechęciłbym się do przekazywania uchwytów liczbowych fd (jak również '/ dev/stdin'), z wyjątkiem i chyba że" proxy "dane procesowe również okazują się zbyt wolne w benchmarku. Powodem jest to, że współdzielone stdin, prędzej czy później, spowoduje błędy, gdy zepsuty proces zrobi odczyt i przesłania strumień danych dla zamierzonego procesu obsługi stdin. – AdamKG

+0

Wystarczająco uczciwe, po prostu trzeba było wspomnieć o użyciu uchwytu pliku po numerze. – synthesizerpatel