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:[email protected]] >Komu: Konference PyCZ <[email protected]> >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 <[email protected]>: >> 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:[email protected]] >>>Komu: Konference PyCZ <[email protected]> >>>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 <[email protected]>: >>>> 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:[email protected]] >>>>>Komu: Konference PyCZ <[email protected]> >>>>>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 >>>>>[email protected] >>>>>http://www.py.cz/mailman/listinfo/python >>>> _______________________________________________ >>>> Python mailing list >>>> [email protected] >>>> http://www.py.cz/mailman/listinfo/python >>>> >>>_______________________________________________ >>>Python mailing list >>>[email protected] >>>http://www.py.cz/mailman/listinfo/python >> _______________________________________________ >> Python mailing list >> [email protected] >> http://www.py.cz/mailman/listinfo/python >> >_______________________________________________ >Python mailing list >[email protected] >http://www.py.cz/mailman/listinfo/python _______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
