Chápu, je to fakt divné. Snad je chyba jen v "javac.exe". Mno, třeba se najde někdo jiný... Každopádně děkuju za ochotu.
Radek 2010/3/15 azurIt <[email protected]>: > 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 > _______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
