Seite 1 von 1

Konsolenausgabe von externen Programm verwenden

Verfasst: Samstag 10. Juli 2010, 12:17
von Francesco
hallo,

angenommen ich möchte in meinem Python programm ein externes programm (wie zb locate) mit os.system oder subprozess, ... aufrufen und an die Konsolenausgabe herankommen.

Geht das irgendwie?
Oder muss ich die Ausgabe in ein temporäres file umleiten das ich dann von python wieder einlese?

Re: Konsolenausgabe von externen Programm verwenden

Verfasst: Samstag 10. Juli 2010, 12:27
von Dav1d
Ja das geht, schau dir mal das subprocess Modul an (Popen und PIPE)

Re: Konsolenausgabe von externen Programm verwenden

Verfasst: Samstag 10. Juli 2010, 13:00
von Francesco
Dav1d hat geschrieben:Ja das geht, schau dir mal das subprocess Modul an (Popen und PIPE)
Sehr gut, danke für den Hinweis.

Re: Konsolenausgabe von externen Programm verwenden

Verfasst: Montag 19. Juli 2010, 12:07
von Francesco
Francesco hat geschrieben:
Dav1d hat geschrieben:Ja das geht, schau dir mal das subprocess Modul an (Popen und PIPE)
Sehr gut, danke für den Hinweis.
Vielleicht interessierts ja noch wen:
Bsp:

Code: Alles auswählen

import os

stdout_handle = os.popen("ls -l", "r")
consoleout = stdout_handle.read()
print consoleout

Re: Konsolenausgabe von externen Programm verwenden

Verfasst: Montag 19. Juli 2010, 12:26
von Hyperion
Francesco hat geschrieben: Sehr gut, danke für den Hinweis.

Vielleicht interessierts ja noch wen:
Bsp:

Code: Alles auswählen

import os

stdout_handle = os.popen("ls -l", "r")
consoleout = stdout_handle.read()
print consoleout
Wieso denn nicht mit subprocess, was Dir empfohlen wurde?

Code: Alles auswählen

In [35]: from subprocess import Popen, PIPE

In [36]: stdout, stderr = Popen(["dir", "/O"], shell=True, stdout=PIPE, stderr=P
IPE).communicate()

In [37]: print stdout
Das shell=True braucht es hier nur wegen der Windows-Shell; sollte unter Linux (ggf. auch Cygwin) unnötig sein.

Re: Konsolenausgabe von externen Programm verwenden

Verfasst: Montag 19. Juli 2010, 13:15
von Francesco
Hab ja nicht mit Absicht nicht an die Tips gehalten... Ja, man sollte die neueren Module wie subprocess verwenden, ok.

BTW:
das Shell braucht man hier (Ubuntu) anscheinend doch

Code: Alles auswählen

stdout, stderr = Popen(["ls -a", "/O"], shell=True, stdout=PIPE, stderr=PIPE).communicate()
stdout, stderr = Popen(["ls -a", "/O"], stdout=PIPE, stderr=PIPE).communicate()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python2.6/subprocess.py", line 621, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1126, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Re: Konsolenausgabe von externen Programm verwenden

Verfasst: Montag 19. Juli 2010, 13:22
von Barabbas
Francesco hat geschrieben:BTW:
das Shell braucht man hier (Ubuntu) anscheinend doch ...
Ne, braucht man nicht: Der Befehl "ls -la /O" such nach einem Verzeichnis "/O" - und das existiert halt nicht.

Re: Konsolenausgabe von externen Programm verwenden

Verfasst: Montag 19. Juli 2010, 13:26
von Hyperion
Das "/O" ist ein Parameter des "dir"-Kommandos der Windows Shell. Das diente nur zur Demonstration... so viel Abstraktion hätte ich denn doch mal erwartet ;-)

Re: Konsolenausgabe von externen Programm verwenden

Verfasst: Montag 19. Juli 2010, 15:16
von Francesco
Hyperion hat geschrieben:Das "/O" ist ein Parameter des "dir"-Kommandos der Windows Shell. Das diente nur zur Demonstration... so viel Abstraktion hätte ich denn doch mal erwartet ;-)
Ah ja, hatte ich etwas zu gedankenlos kopiert und geändert.

Funktioniert:

Code: Alles auswählen

stdout, stderr = Popen(["ls", "-a"], stdout=PIPE, stderr=PIPE).communicate()