Seite 1 von 1
Weiterverarbeitung von stdout
Verfasst: Freitag 24. Juli 2009, 11:53
von schwedenmann
Hallo
Absoluter Anfänger hat ein Problem, wie stdout weiter zu bearbeiten ist.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import subprocess, popen2
import string
# log my IP (lmIP)
#Version 0.1
# Copyright schwedenmann, 2009
# License, GPL3
#
#
befehl= "curl -s
http://checkip.dyndns.org"
process = subprocess.Popen(befehl , shell=True, stdout=subprocess.PIPE)
s = process.stdout.read()
print s
liefert folgende Zeile
<html><head><title>Current IP Check</title></head><body>Current IP Address: 78.48.78.143</body></html>
ist auch soweit alles ok, jetzt möchte ich aber die IP-Adresse (nur die Zahlen) extrahieren (odr Abschneiden von vorn und von hinten), wie stell ich das am Einfachsten an ?
Die IP soll später in eine Datei nach /home/usernale/lmip.log geschrieben werden und alle weiteren Ip durch das Programms in diese Datei geschrieben werden.
Mir geht es jetzt nur um das Extrahieren der IP, da das Ganze ja kein String zu sein scheint, bin ich da völlig ratlos.
Verfasst: Freitag 24. Juli 2009, 11:55
von Defnull
a) Warum ist 's' kein String?
b) Warum benutzt du nicht urllib2.urlopen?
c) ip = re.search(r'[1-9\.]+',s).group(0)
Weiterverarbeitung
Verfasst: Freitag 24. Juli 2009, 13:44
von schwedenmann
Hallo
hab jetzt
liefert genau dasselbe wie curl -s etc. von oben
Nur ich hab jetzt wider keien Ahnung, wie ich das weiterverarbeiten soll, ohne das Ganze voher per f.open in eine Datei abzuspeichern.
Ich brauche nur Hinweise, in welche Richtung in gehn muß.
f.seek(-5)
f.read(1)
sollte doch das 5. Zeichen vom Enbe und dann das 1. Zeichen ausgeben, das funktioneirt wohl nur, wenn die Ausgabe von urllib2.urlopen in eine Datei geschrieben wird, oder gehts auch einfacher.
Verfasst: Freitag 24. Juli 2009, 14:02
von Defnull
irllib2.urlopen() [1] gibt ein FileLike [2] Objekt zurück. Mit FileLike.read() liest du die komplette Datei in einen String. Nach einem "s = f.read()" ist in 's' also ein String, keine Datei.
Bei Strings kannst du direkt auf jedes einzelne Zeichen zu greifen, sowas wie seek() ist nicht nötig, da sich ja schon alles im Speicher befindet.
Code: Alles auswählen
# Erst einmal laden wir den Inhalt der Seite als String in eine Variable.
html = urllib2.urlopen('http://checkip.dyndns.org').read()
# Nun gibt es mehrere Möglichkeiten:
ip = re.search(r'[1-9\.]+',html).group(0) #[3]
ip = html[76:-16] #[4]
Und bitte, schau dir mal das Tutorial[5] an!
[1]:
http://docs.python.org/library/urllib2.html
[2]:
http://docs.python.org/library/stdtypes ... le-objects
[3]:
http://docs.python.org/library/re.html
[4]:
http://docs.python.org/library/stdtypes.html#typesseq
[5]:
http://docs.python.org/tutorial/index.html
Stringverarbeitung
Verfasst: Freitag 24. Juli 2009, 14:20
von schwedenmann
Hallo
Und bitte, schau dir mal das Tutorial[5] an!
Danke, werde ich machen, neben den ebooks die ichs chon habe.
P.S.
Nur eine Frage
Wenn ich mit urllib2.urlopen den strig auslese muß ich
f.read(102) eintippen um den komplett am Bildschirm zu sehen (ergo ist der String 103 Zeichen lang, da die Informatiker ja bei 0 anfangen zu zählen).
Wenn ich mit subprocess (mein 1.post) auslese und print len(s) eintippe erhalte ich als Länge 104 und nicht wie erwartet 103 !
Woran liegt der Unterschied 102 und 104, hab jetzt die korrekte Zahl selbst nicht nachgezählt.
Verfasst: Freitag 24. Juli 2009, 14:29
von Defnull
Kann ich nicht reproduzieren
Code: Alles auswählen
>>> import urllib2
>>> import subprocess
>>> len(urllib2.urlopen('http://checkip.dyndns.org').read())
103
>>> len(subprocess.Popen("curl -s http://checkip.dyndns.org", shell=True, stdout=subprocess.PIPE).stdout.read())
103
Verfasst: Freitag 24. Juli 2009, 14:31
von jbs
Code: Alles auswählen
file = 'tmp.tmp'
with open(file, 'w') as f:
f.write( 10 * '*')
with open(file, 'r') as f:
text = f.read(9)
print(text)
print(len(text))
ergibt 9 Sternchen
Informatiker fangen häufig an bei 0 zu Zählen. Aber ein String besitzt eine Länge von 0, wenn er leer ist. (Gleiches gilt dann auch für die bufsize von read).
Vielleicht hat sich deine IP-Adresse geändert, oder da sind vielleicht whitespaces mitgekommen.
strinlänge
Verfasst: Freitag 24. Juli 2009, 14:43
von schwedenmann
Hallo
f = urllib2.urlopen('
http://checkip.dyndns.org')
print f.read(102)
#f.seek(-3, 2)
#print f.read(1)
befehl= "curl -s
http://checkip.dyndns.org"
process = subprocess.Popen(befehl , shell=True, stdout=subprocess.PIPE)
s = process.stdout.read()
print s
print len(s)
Ausgabe
<html><head><title>Current IP Check</title></head><body>Current IP Address: 78.48.78.143</body></html>
<html><head><title>Current IP Check</title></head><body>Current IP Address: 78.48.78.143</body></html>
104
Die strings sind gleich lang
1. mit f.read(102), sollte also 103 lang sein
2. Länge per len(s) 104
Verfasst: Freitag 24. Juli 2009, 14:51
von cofi
Dann lass dir mal von beiden Strings ``repr()`` ausgeben.
Verfasst: Freitag 24. Juli 2009, 14:55
von jbs
Also "<html><head><title>Current IP Check</title></head><body>Current IP Address: 78.48.78.143</body></html> " ist 102 Zeichen lang.
Hast du Ausgabe original kopiert? Denn die newline macht mich gerade stutzig.
Bzw:
Defnull hat geschrieben:Kann ich nicht reproduzieren
Code: Alles auswählen
>>> import urllib2
>>> import subprocess
>>> len(urllib2.urlopen('http://checkip.dyndns.org').read())
103
>>> len(subprocess.Popen("curl -s http://checkip.dyndns.org", shell=True, stdout=subprocess.PIPE).stdout.read())
103
string Länge
Verfasst: Freitag 24. Juli 2009, 15:06
von schwedenmann
Hallo
Code:
f = urllib2.urlopen('
http://checkip.dyndns.org')
print f.read(102)
print repr(f)
#f.seek(-3, 2)
#print f.read(1)
befehl= "curl -s
http://checkip.dyndns.org"
process = subprocess.Popen(befehl , shell=True, stdout=subprocess.PIPE)
s = process.stdout.read()
print s
print len(s)
print repr(s)
Ausgabe 1:1 kopiert:
<html><head><title>Current IP Check</title></head><body>Current IP Address: 78.48.78.143</body></html>
<addinfourl at 3081165580L whose fp = <socket._fileobject object at 0xb7c6ad14>>
<html><head><title>Current IP Check</title></head><body>Current IP Address: 78.48.78.143</body></html>
104
'<html><head><title>Current IP Check</title></head><body>Current IP Address: 78.48.78.143</body></html>\r\n'
Verfasst: Freitag 24. Juli 2009, 15:11
von cofi
Tjoa .. da hast du doch deine 2 Zeichen: Das Zeilenende nach HTTP-Standard.
``strip()`` ist dein Freund.