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
Daten aus Shell/Konsole kopieren
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
Noch als Erklärung. Ich möchte ein Programm ausführen und den Output (der in der Konsole steht) einlesen.
detlef
Ich bin gerade auf das gestoßen:
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?
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
@01detlef: Du musst alle Zeilen lesen, denn ohne die Zeile anzuschauen kann man ja schlecht entscheiden ob sie das enthält was Du suchst.
Hallo,
ich habe das nun mal probiert und ich bekomme immer den Fehler:
Was hat das zu bedeuten?
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'
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Dass du `Popen` falsch geschrieben hast.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@01detlef Ich weiß, was "alias" ist, ich habe Deinem Beitrag aber nicht entnehmen können, was Du damit anstellen willst.
Also ich habe auch Popen groß geschrieben und es kommt immer noch eine Fehlermeldung:
Woran liegt das?
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
@ 01detlef Dieser Fehler bedeutet, dass das Programm, welches Du versuchst auszuführen, nicht existiert. Wie sieht denn der Inhalt von "command" aus?
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
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
usw.
Nun wird aber gemeckert, dass line[0] nicht geht. Dabei meine ich sowas schon mal gemacht zu haben...
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)
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
Nun wird aber gemeckert, dass line[0] nicht geht. Dabei meine ich sowas schon mal gemacht zu haben...
@01detlef:
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.
Code: Alles auswählen
Traceback (most recent call last):
Mecker: line[0] geht nicht
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.
Hm, ich hätte es ja so gelöst:
In der Shell:Im Skript:
In der Shell:
Code: Alles auswählen
alias_befehl | skript.py
Code: Alles auswählen
import sys
for line in sys.stdin:
# tu was mit line
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.
So in der Art, nun soll nur noch die richtige Zeile eingelesen oder gesucht werden. GIbt es da eine bessere Lösung?
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
Hallo,
ok, aber einlesen muss ich jede Zeile erstmal mit der for-Schleife oder? Und dann kann ich re.split verwenden und sagen
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.
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]
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.
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.