[python] Problém s subprocess

azurIt azurit na pobox.sk
Neděle Březen 14 23:43:09 CET 2010


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:radekholypublic na gmail.com]
>Komu: Konference PyCZ <python na py.cz>
>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 <azurit na pobox.sk>:
>> Argumenty davas v liste ? Skusal si pustat aj nieco ine ako javu ?
>>
>>
>>>-----Pôvodná správa-----
>>>Od: Radek Hol [mailto:radekholypublic na gmail.com]
>>>Komu: Konference PyCZ <python na py.cz>
>>>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 <azurit na pobox.sk>:
>>>> 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:azurit na pobox.sk]
>>>>>Komu: python na py.cz
>>>>>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:radekholypublic na gmail.com]
>>>>>>Komu: Konference PyCZ <python na py.cz>
>>>>>>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 <azurit na pobox.sk>:
>>>>>>> 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:radekholypublic na gmail.com]
>>>>>>>>Komu: Konference PyCZ <python na py.cz>
>>>>>>>>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 <azurit na pobox.sk>:
>>>>>>>>> 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:radekholypublic na gmail.com]
>>>>>>>>>>Komu: Konference PyCZ <python na py.cz>
>>>>>>>>>>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
>>>>>>>>>>Python na py.cz
>>>>>>>>>>http://www.py.cz/mailman/listinfo/python
>>>>>>>>> _______________________________________________
>>>>>>>>> Python mailing list
>>>>>>>>> Python na py.cz
>>>>>>>>> http://www.py.cz/mailman/listinfo/python
>>>>>>>>>
>>>>>>>>_______________________________________________
>>>>>>>>Python mailing list
>>>>>>>>Python na py.cz
>>>>>>>>http://www.py.cz/mailman/listinfo/python
>>>>>>> _______________________________________________
>>>>>>> Python mailing list
>>>>>>> Python na py.cz
>>>>>>> http://www.py.cz/mailman/listinfo/python
>>>>>>>
>>>>>>_______________________________________________
>>>>>>Python mailing list
>>>>>>Python na py.cz
>>>>>>http://www.py.cz/mailman/listinfo/python
>>>>>_______________________________________________
>>>>>Python mailing list
>>>>>Python na py.cz
>>>>>http://www.py.cz/mailman/listinfo/python
>>>> _______________________________________________
>>>> Python mailing list
>>>> Python na py.cz
>>>> http://www.py.cz/mailman/listinfo/python
>>>>
>>>_______________________________________________
>>>Python mailing list
>>>Python na py.cz
>>>http://www.py.cz/mailman/listinfo/python
>> _______________________________________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/listinfo/python
>>
>_______________________________________________
>Python mailing list
>Python na py.cz
>http://www.py.cz/mailman/listinfo/python


Další informace o konferenci Python