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
