Weiterverarbeitung von stdout

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
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

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.
mfg
schwedenmann
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

a) Warum ist 's' kein String?
b) Warum benutzt du nicht urllib2.urlopen?
c) ip = re.search(r'[1-9\.]+',s).group(0)
Bottle: Micro Web Framework + Development Blog
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo

hab jetzt
f = urllib2.urlopen('http://checkip.dyndns.org')
print f.read(102)
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.
mfg
schwedenmann
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

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
Bottle: Micro Web Framework + Development Blog
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

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.
mfg
schwedenmann
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

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
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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.
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

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
mfg
schwedenmann
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dann lass dir mal von beiden Strings ``repr()`` ausgeben.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

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'
mfg
schwedenmann
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Tjoa .. da hast du doch deine 2 Zeichen: Das Zeilenende nach HTTP-Standard.

``strip()`` ist dein Freund.
Antworten