Tak to dopadne takto: ------------------------------------------------------------------------- >>> javac = subprocess.Popen(command, stdout=subprocess.PIPE, >>> stderr=subprocess.STDOUT) >>> while True: >>> data = javac.stdout.read() >>> print [data] >>> if not data: break [''] (Hláška "javac.exe" se NEvypíše.) -------------------------------------------------------------------------
Děkuju, Radek 2010/3/14 azurIt <[email protected]>: > 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:[email protected]] >>Komu: [email protected] >>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:[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 > _______________________________________________ > Python mailing list > [email protected] > http://www.py.cz/mailman/listinfo/python > _______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
