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

Odpovedet emailem