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
