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

Odpovedet emailem