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

Odpovedet emailem