Seite 1 von 2

Daten aus Shell/Konsole kopieren

Verfasst: Donnerstag 11. Oktober 2012, 16:51
von 01detlef
Hallo zusammen,

ich habe ein ein kleines Programm (Python), das einen "alias-Befehl" ausführt und dadurch einen Output in die Konsole/Shell schreibt. Nun möchte ich diesen Output in das kleine Python-Programm einlesen und damit weiterarbeiten. Wie kann man sowas machen?

MFG

Re: Daten aus Shell/Konsole kopieren

Verfasst: Donnerstag 11. Oktober 2012, 17:38
von lunar
@01detlef Was ist ein "alias"-Befehl?

Re: Daten aus Shell/Konsole kopieren

Verfasst: Donnerstag 11. Oktober 2012, 17:56
von 01detlef
Also alias-Befehl ist sozusagen ein Shortcut. Man kann damit selber Namen für einen Befehl vergeben. Es wird also ein Programm dadurch ausgeführt.

Noch als Erklärung. Ich möchte ein Programm ausführen und den Output (der in der Konsole steht) einlesen.

detlef

Re: Daten aus Shell/Konsole kopieren

Verfasst: Donnerstag 11. Oktober 2012, 17:58
von BlackJack
@01detlef: Du suchst vielleicht das `subprocess`-Modul‽

Re: Daten aus Shell/Konsole kopieren

Verfasst: Donnerstag 11. Oktober 2012, 18:38
von 01detlef
Ich bin gerade auf das gestoßen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import subprocess

# filename and searchterm
fn, term = 'access_log.gz', 'hello'
p = subprocess.Popen(['/usr/bin/zgrep', term, fn ], stdout=subprocess.PIPE)
for line in p.stdout:
    print line
Noch besser wäre nun, wenn ich nur nach einer Zeile im Output suche, so dass ich nur eine Zeile davon einlesen muss. Kann man dann irgendwie ein grep auf p.stdout machen oder wie kann sowas gehen?

Re: Daten aus Shell/Konsole kopieren

Verfasst: Donnerstag 11. Oktober 2012, 18:52
von BlackJack
@01detlef: Du musst alle Zeilen lesen, denn ohne die Zeile anzuschauen kann man ja schlecht entscheiden ob sie das enthält was Du suchst.

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 07:26
von 01detlef
Hallo,
ich habe das nun mal probiert und ich bekomme immer den Fehler:

Code: Alles auswählen

p = subprocess.popen(command, stdout=subprocess.PIPE)
AttributeError: 'module' object has no attribute 'popen'
Was hat das zu bedeuten?

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 07:41
von cofi
Dass du `Popen` falsch geschrieben hast.

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 08:22
von lunar
@01detlef Ich weiß, was "alias" ist, ich habe Deinem Beitrag aber nicht entnehmen können, was Du damit anstellen willst.

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 12:18
von 01detlef
Also ich habe auch Popen groß geschrieben und es kommt immer noch eine Fehlermeldung:

Code: Alles auswählen

  File "exe_save_cl.py", line 10, in <module>
    p = subprocess.Popen([command], stdout=subprocess.PIPE)
  File "/.../python/lib/python2.6/subprocess.py", line 595, in __init__
    errread, errwrite)
  File "/.../python/lib/python2.6/subprocess.py", line 1106, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
Woran liegt das?

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 12:22
von lunar
@ 01detlef Dieser Fehler bedeutet, dass das Programm, welches Du versuchst auszuführen, nicht existiert. Wie sieht denn der Inhalt von "command" aus?

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 13:20
von 01detlef
OKay,

es war natürlich ein Fehler im Befehl!!!!

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 14:17
von 01detlef
Man man, ich komme nicht so richtig weiter.
Der Befehl wird nun ausgegeben und es wird Text in die Konsole geschrieben.
Ich lasse mir den ausgeben und splitten mit

Code: Alles auswählen

for line in p.stdout:
    line =  line.rstrip('\n')
    line = string.split(line)
Nun fängt die eine Zeile mit 'CRW' an und dann folgt eine Zahl. Genau diese Zeile
möchte ich haben und deshalb wollte ich das so machen

Code: Alles auswählen

for line in p.stdout:
    line =  line.rstrip('\n')
    line = string.split(line)
    line = line[0]
    if (line[0] == 'CRW'):
       print line
usw.
Nun wird aber gemeckert, dass line[0] nicht geht. Dabei meine ich sowas schon mal gemacht zu haben...

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 15:04
von jerch
@01detlef:

Code: Alles auswählen

Traceback (most recent call last):
    Mecker: line[0] geht nicht
Wenn das Deine Fehlermeldung ist, kann Dir hier sicher keiner helfen. Eine exaktere Problembeschreibung wirkt Wunder ;)

zu Deinem Code:
Die Funktionen aus dem string-Modul sind veraltet, besser fährst Du mit der Methode des Stringobjektes.
Überleg mal, was `line = line[0]` macht und welche Konsequenzen das für folgende `line[0]`-Verweise hat, wenn das erste Element der split-Liste leer ist und ob Dein Test jemals wahr werden kann.
Vllt. hilft Dir die Stringmethode startswith weiter, für kompliziertere Pattern gibts das re-Modul.

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 17:48
von 01detlef
Hallo,

ich habe nun das re-Modul verwendet und es funktioniert so weit.

mfg

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 18:50
von nomnom
Hm, ich hätte es ja so gelöst:

In der Shell:

Code: Alles auswählen

alias_befehl | skript.py
Im Skript:

Code: Alles auswählen

import sys

for line in sys.stdin:
    # tu was mit line

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 19:28
von 01detlef
Hallo,

mein Problem war aber eher den Output in der Konsole durch die AUsführung eines Befehls herauszukopieren. Also es wird einiger Output erzeugt und davon möchte ich eine Zeile, die mit einem bestimmten Wort beginnt, einlesen. Ich habe da immer noch nicht wirklich eine Idee/Lösung und würde mich über einen Tipp freuen.

Code: Alles auswählen

for line in p.stdout:
    line =  line.rstrip('\n')
    #line = string.split(line)
    #line = line[0]
    #if (line[0] == 'CRW'):
     #  print line
So in der Art, nun soll nur noch die richtige Zeile eingelesen oder gesucht werden. GIbt es da eine bessere Lösung?

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 19:42
von sparrow
Was ist mit den Tipps von jerch?

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 20:02
von 01detlef
Hallo,

ok, aber einlesen muss ich jede Zeile erstmal mit der for-Schleife oder? Und dann kann ich re.split verwenden und sagen

Code: Alles auswählen

line = re.split(line)
if line[0] == '..':
   print line
   out = line[2]
Ist das sinnvoll? Also die gesuchte Zeile hat nach dem splitten drei Teile und ich möchte nur den dritten Teil in der Zeile haben.

Re: Daten aus Shell/Konsole kopieren

Verfasst: Freitag 12. Oktober 2012, 20:23
von sparrow
Nein, das ist nicht sinnvoll dafür das re-Modul zu bemühen. Strings haben automatisch eine .split()-Methode.
Wenn du weißt, dass Zeilen die mit dem Wort anfangen, immer eine bestimmte Anzhal von "gesplitteten Elementen" haben, dann reicht es das erste Element auf Gleichheit zu prüfen und anschließend mit den andren zu tun wofür du sie brauchst.