Mam ogólne pytanie o popen (i wszystkie powiązane funkcje), mające zastosowanie do wszystkich systemów operacyjnych, kiedy piszę skrypt Pythona lub jakiś kod c i uruchamiam wynikowy plik wynikowy z konsola (wygrana lub linux), natychmiast widzę wyjście z procesu. Jeśli jednak uruchomię ten sam plik wykonywalny jako proces rozwidlony, a jego standardowe wyjście zostanie przekierowane do potoku, dane wyjściowe będą buforowane gdzieś, zwykle do 4096 bajtów, zanim zostaną zapisane do potoku, gdzie proces nadrzędny może go odczytać.Pomijanie buforowania wyjścia podprocesowego z popen w C lub Pythonie
Poniższy skrypt Pythona będzie generować dane wyjściowe w kawałki 1024 bajtów
import os, sys, time
if __name__ == "__main__":
dye = '@'*1024
for i in range (0,8):
print dye
time.sleep(1)
Poniższy skrypt Pythona wykona poprzedni skrypt i odczytać dane wyjściowe tak szybko, jak to jest do rury, bajt po bajcie
import os, sys, subprocess, time, thread
if __name__ == "__main__":
execArgs = ["c:\\python25\\python.exe", "C:\\Scripts\\PythonScratch\\byte_stream.py"]
p = subprocess.Popen(execArgs, bufsize=0, stdout=subprocess.PIPE)
while p.returncode == None:
data = p.stdout.read(1)
sys.stdout.write(data)
p.poll()
Dostosuj ścieżkę do systemu operacyjnego. Po uruchomieniu w tej konfiguracji dane wyjściowe nie będą wyświetlane w porcjach o rozmiarze 1024, ale o rozmiarze 4096, mimo że rozmiar bufora polecenia popen jest ustawiony na 0 (co jest domyślne). Czy ktoś może mi powiedzieć, jak zmienić to zachowanie ?, czy jest jakiś sposób zmusić system operacyjny do traktowania wyjścia z rozwidlonego procesu w taki sam sposób, jak przy uruchamianiu z konsoli ?, tj. Po prostu przesłać dane przez bez buforowania?
próbowałem grać z -u, bez radości, ale pexpect wydaje się obiecujący, dziękuję! –
tylko po to, aby kontynuować, pexpect działa jak czar, wexpect jest trochę kłopotliwy (i trudny do znalezienia), ale wykonuje swoją robotę. Właśnie tam znalazłem najnowszą wersję Wexpect: http://sage.math.washington.edu/home/goreckc/sage/wexpect/ –
Dzięki Gearoid, co ciekawe, wexpect nie został zaktualizowany do najnowszej wersji W domu code.google.com zastanawiam się, dlaczego! –