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
