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