[python] Problém s subprocess

azurIt azurit na pobox.sk
Sobota Březen 13 23:26:27 CET 2010


Skusal si to pustat mimo PyDev ?

To, ako sa ti to sprava, je vcelku zvlastne, pretoze ked zavolas communicate(), tak subprocess pocka na dokoncenie programu (nie je teda mozne, ze ten skonci az po skonceni skriptu). Skus este funkcie/premenne stadeto:
http://docs.python.org/release/2.5.4/lib/node532.html

Hlavne wait(), poll() a returncode.


>-----Pôvodná správa-----
>Od: Radek Hol [mailto:radekholypublic na gmail.com]
>Komu: Konference PyCZ <python na py.cz>
>Predmet: Re: [python] Problém s subprocess
>
>
>Děkuju za odpověď.
>Předtím jsem si experimentálně ověřil, že bez přesměrování se to také
>vypisuje na stdout, stderr.
>Pro jistotu uvádím výsledky různých možností:
>
>-------------------------------------------------------------------------
>>>> javac = subprocess.Popen(command)
>(Hláška "javac.exe" se vypíše.)
>-------------------------------------------------------------------------
>>>> javac = subprocess.Popen(command)
>>>> print javac.communicate()
>(None, None)
>(Hláška "javac.exe" se NEvypíše.)
>-------------------------------------------------------------------------
>>>> javac = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>(Hláška "javac.exe" se NEvypíše.)
>-------------------------------------------------------------------------
>>>> javac = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>>> print javac.communicate()
>('', '')
>(Hláška "javac.exe" se NEvypíše.)
>-------------------------------------------------------------------------
>>>> javac = subprocess.Popen(command, stdout=sys.stdout, stderr=sys.stderr)
>(Hláška "javac.exe" se vypíše.)
>-------------------------------------------------------------------------
>>>> javac = subprocess.Popen(command, stdout=sys.stdout, stderr=sys.stderr)
>>>> print javac.communicate()
>(None, None)
>(Hláška "javac.exe" se NEvypíše.)
>-------------------------------------------------------------------------
>
>Navíc by to bohužel neřešilo ten druhý podstatnější problém, že se mi
>soubor (Main.class) vytvoří až po skončení mého programu.
>
>Pro jistotu uvádím, že testuji v prostředí PyDev.
>
>Děkuji, Radek
>
>
>
>2010/3/13 azurIt <azurit na pobox.sk>:
>> subprocess predsa plne podporuje presmerovanie standardneho aj chyboveho vystupu (hint: stdout, stderr):
>> http://docs.python.org/release/2.5.4/lib/node528.html
>>
>> Priklad:
>>
>> import subprocess
>> javac = subprocess.Popen(args=["C:\\java\\bin\\javac.exe Main.java -d ."], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
>> print javac.communicate()
>>
>> azur
>>
>>
>>>-----Pôvodná správa-----
>>>Od: Radek Hol [mailto:radekholypublic na gmail.com]
>>>Komu: Konference PyCZ <python na py.cz>
>>>Predmet: [python] Problém s subprocess
>>>
>>>
>>>Ahoj,
>>>chtěl bych se Vás zeptat, zda byste mi neuměli poradit s mým problémem
>>>s voláním externího programu.
>>>Používám Python 2.5.4 (věřím, že kvůli kompatibilitě s Jython 2.5.1)
>>>na Windows 7.
>>>
>>>Snažím se o spuštění "překladače" "javac.exe":
>>>
>>>------------------------------------------------
>>>...
>>>javac = subprocess.Popen(u"C:\\java\\bin\\javac.exe Main.java -d .")
>>>javac.communicate()
>>>------------------------------------------------
>>>
>>>Zjistil jsem ale, že takto volaný externí program (nebo alepoň
>>>"javac.exe") s následným voláním "communicate()" (ale nemusí to být
>>>jen volání této metody - může to být jakýkoliv další kód) mi nevypíše
>>>na chybový výstup žádné informace (pokud je chyba v "Main.java"), i
>>>když při volání ze systémové příkazové řádky se informace vypíší.
>>>Dále jsem zjistil, že když můj program skončí ihned po
>>>"...subprocess.Popen..." (tedy vynechám "communicate()"), tak se na
>>>chybový výstup vypíše, co má. Jenže já tímto samozřejmě nechci
>>>končit...
>>>Zkoušel jsem i použití funkce "time.sleep()", ale bez úspěchu.
>>>Pokud v "Main.java" chyba není, má "javac.exe" vygenerovat soubor
>>>"Main.class", jenže chování je podobné... Tedy, pokud se pod voláním
>>>"javac.exe" vyskytuje ještě další kód, soubor "Main.class" se
>>>vygeneruje až po skončení mého programu. (Ověřeno pomocí
>>>"os.path.exists()" i "os.listdir()")
>>>Přitom návratový kód je již nastaven...
>>>
>>>Předem děkuji za pomoc, Radek Holý
>>>_______________________________________________
>>>Python mailing list
>>>Python na py.cz
>>>http://www.py.cz/mailman/listinfo/python
>> _______________________________________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/listinfo/python
>>
>_______________________________________________
>Python mailing list
>Python na py.cz
>http://www.py.cz/mailman/listinfo/python


Další informace o konferenci Python