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
