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

Odpovedet emailem