Skus este toto: import subprocess, sys javac = subprocess.call(["C:\\java\\bin\\javac.exe", "Main.java", "-d", "."], stdout=sys.stdout, stderr=sys.stderr) print javac
>-----Pôvodná správa----- >Od: Radek Hol [mailto:[email protected]] >Komu: Konference PyCZ <[email protected]> >Predmet: Re: [python] Problém s subprocess > > >Něco jiného než Javu, jsem nezkoušel spustit. >Pokud i po tom, co teď napíšu, budeš myslet, že to mám zkusit, můžu... >Zajímavá věc totiž je, že pokud spustím jen: > >------------------------------------------------ >... >javac = subprocess.Popen(u"C:\\java\\bin\\javac.exe") >javac.communicate() >------------------------------------------------ > >tak se výpis ("usage") vypíše, i když tam je "communicate()". Takže to >vypadá, že za to může asi "javac.exe", že? Ale jak to může fungovat? > >Argumenty dávám ve stringu. Ale teď jsem zkusil > >------------------------------------------------ >... >javac = subprocess.Popen(["C:\\java\\bin\\javac.exe", "Main.java", "-d", "."]) >javac.communicate() >------------------------------------------------ > >i > >------------------------------------------------ >... >>>> javac = subprocess.Popen(["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 >------------------------------------------------ > >a dopadlo to stejně jako se stringem. > >Děkuji, Radek > > > >2010/3/14 azurIt <[email protected]>: >> Argumenty davas v liste ? Skusal si pustat aj nieco ine ako javu ? >> >> >>>-----Pôvodná správa----- >>>Od: Radek Hol [mailto:[email protected]] >>>Komu: Konference PyCZ <[email protected]> >>>Predmet: Re: [python] Problém s subprocess >>> >>> >>>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 >> _______________________________________________ >> 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
