Konsolenausgabe von externen Programm verwenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ja das geht, schau dir mal das subprocess Modul an (Popen und PIPE)
the more they change the more they stay the same
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Dav1d hat geschrieben:Ja das geht, schau dir mal das subprocess Modul an (Popen und PIPE)
Sehr gut, danke für den Hinweis.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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()
Antworten