[python] Problém s subprocess

azurIt azurit na pobox.sk
Neděle Březen 14 22:03:21 CET 2010


Pardon, ta tvoja aplikacia ma aj argumenty (som robil len copy&paste a nepozeral, co tam je):

javac = subprocess.Popen(args=["C:\\java\\bin\\javac.exe", "Main.java", "-d", "."], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)



>-----Pôvodná správa-----
>Od: azurIt [mailto:azurit na pobox.sk]
>Komu: python na py.cz
>Predmet: Re: [python] Problém s subprocess
>
>
>A toto ?
>
>import subprocess
>javac = subprocess.Popen(args=["C:\\java\\bin\\javac.exe Main.java -d ."], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
>
>while True:
>data = javac.stdout.read()
>print [data]
>if not data: break
>
>
>
>>-----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
>>
>>
>>Právě jsem zkusil tyto dvě varianty v systémovém příkazovém řádku
>>(python MakeJar.py) a dopadlo to stejně:
>>
>>-------------------------------------------------------------------------
>>>>> 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.)
>>-------------------------------------------------------------------------
>>
>>Možná by pomohlo to, že při první variantě to vypadá tak, že se spustí
>>můj program. Program skončí. Vypíše se "command line prompt" ("C:\>").
>>A teprve potom se vypíše hláška od "javac.exe".
>>Mám zkoušet i ostatní varianty spustit z příkazového řádku?
>>Předpokládam, že to není nutné...
>>
>>Dále jsem zjistil, že když spustím první variantu (bez
>>"communicate()") a na konec program přidám ještě třeba jen jednoduché
>>"print "a"" (i několikrát), tak se výpis "javac.exe" vypíše. Pokud ale
>>na konec dám např. "time.sleep()" nebo třeba "shutil.copytree()" (na
>>nějaký větší adresář), tak se výpis nevypíše.
>>
>>Další metody subprocess dopadly takto:
>>
>>-------------------------------------------------------------------------
>>>>> javac = subprocess.Popen(command)
>>>>> print javac.returncode
>>None
>>(Hláška "javac.exe" se vypíše.)
>>-------------------------------------------------------------------------
>>>>> javac = subprocess.Popen(command)
>>>>> print javac.returncode
>>None
>>(Hláška "javac.exe" se vypíše.)
>>-------------------------------------------------------------------------
>>>>> javac = subprocess.Popen(command)
>>>>> print javac.communicate()
>>(None, None)
>>>>> print javac.returncode
>>0
>>(Hláška "javac.exe" se NEvypíše.)
>>-------------------------------------------------------------------------
>>>>> javac = subprocess.Popen(command)
>>>>> print javac.poll()
>>None
>>(Hláška "javac.exe" se vypíše.)
>>-------------------------------------------------------------------------
>>>>> javac = subprocess.Popen(command)
>>>>> print javac.communicate()
>>(None, None)
>>>>> print javac.poll()
>>0
>>(Hláška "javac.exe" se NEvypíše.)
>>-------------------------------------------------------------------------
>>>>> javac = subprocess.Popen(command)
>>>>> print javac.wait()
>>0
>>(Hláška "javac.exe" se NEvypíše.)
>>-------------------------------------------------------------------------
>>>>> javac = subprocess.Popen(command)
>>>>> print javac.communicate()
>>(None, None)
>>>>> print javac.wait()
>>0
>>(Hláška "javac.exe" se NEvypíše.)
>>-------------------------------------------------------------------------
>>
>>Děkuji, Radek
>>
>>
>>
>>
>>
>>2010/3/13 azurIt <azurit na pobox.sk>:
>>> 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
>>> _______________________________________________
>>> 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