[python] Problém s subprocess

Radek Holý radekholypublic na gmail.com
Sobota Březen 13 22:06:47 CET 2010


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
>


Další informace o konferenci Python