Sorry, dosli mi napady :) return code 0 je ok, znaci to, ze aplikacia skoncila v poriadku. Bohuzial neviem preco sa nedostanes k vystupu, s modulom subprocess som zatial nemal ziadny problem (ale robim len na linuxe).
>-----Pôvodná správa----- >Od: Radek Hol [mailto:[email protected]] >Komu: Konference PyCZ <[email protected]> >Predmet: Re: [python] Problém s subprocess > > >Aha, pardon. > >Tak to mi připadá zajímavé: > >------------------------------------------------------------------------- >>>> javac = subprocess.call(command, stdout=sys.stdout, stderr=sys.stderr) >(Hláška "javac.exe" se NEvypíše.) >------------------------------------------------------------------------- >>>> javac = subprocess.call(command, stdout=sys.stdout, stderr=sys.stderr) >>>> print javac >0 >(Hláška "javac.exe" se NEvypíše.) >------------------------------------------------------------------------- > >Děkuji, Radek > > > >2010/3/15 azurIt <[email protected]>: >> pozor, ja som pouzil funkciu call(), nie Popen(): >> >>>>> import subprocess >>>>> help(subprocess.call) >> >> >>>-----Pôvodná správa----- >>>Od: Radek Hol [mailto:[email protected]] >>>Komu: Konference PyCZ <[email protected]> >>>Predmet: Re: [python] Problém s subprocess >>> >>> >>>Stejné: :-( >>> >>>------------------------------------------------------------------------- >>>>>> 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.) >>>------------------------------------------------------------------------- >>>>>> javac = subprocess.Popen(command, stdout=sys.stdout, stderr=sys.stderr) >>>>>> print javac >>><subprocess.Popen object at 0x013E7AD0> >>>(Hláška "javac.exe" se vypíše.) >>>------------------------------------------------------------------------- >>>>>> javac = subprocess.Popen(command, stdout=sys.stdout, stderr=sys.stderr) >>>>>> print javac.communicate() >>>(None, None) >>>>>> print javac >>><subprocess.Popen object at 0x013E7AD0> >>>(Hláška "javac.exe" se NEvypíše.) >>>------------------------------------------------------------------------- >>> >>>Tak mě napadlo, kvůli chování, které jsem popsal v předchozím >>>příspěvku (a kvůli tomu promptu při mému pokusu z příkazové řádky), >>>jestli "javac.exe" na kontrolu syntaxe (a možná i "překlad"), nemůže >>>volat ještě nějaký další proces a ten končí až po tomto... >>> >>> >>>2010/3/14 azurIt <[email protected]>: >>>> 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 >>>> >>>_______________________________________________ >>>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
