ftp info aus datei einlesen und verzeichnisliste wegschreibe

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 6. September 2004, 17:55

jo da scheint eine falsche dll dazwischen geraten zu sein bei dir. An der Stelle muss ich mich als Linuxuser leider ausklinken, Es gibt hier aber auch Windowsuser hier.


Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Gast

Beitragvon Gast » Montag 6. September 2004, 18:04

hehe aber das mit dem import ftplib war schon ok ?
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 6. September 2004, 18:14

jo da mit dem import ftplib passt 8)

Code: Alles auswählen

#!/usr/bin/env python
import this
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Montag 6. September 2004, 18:25

Dookie hat geschrieben:jo da scheint eine falsche dll dazwischen geraten zu sein bei dir. An der Stelle muss ich mich als Linuxuser leider ausklinken, Es gibt hier aber auch Windowsuser hier.


Dookie

Hi. Dann versuch ich mich mal einzuklinken :wink: . De facto findet er eineveraltete Bibliothek. Hast du wenigestens vorher schon einmal Python 2.1 installiert gehabt? Ich glaub zwar nicht, dass dies der Fall ist, aber möglich wäre es ja. In meinen Augen seh ich nur die Holzhammermethode, die bei Windowsproblemen meistens greift: runter von der Platte und nacheinmal drauf :roll: ... Wenn es aber auch nur die eine DLL ist, die spinnt müsste es eigentlich auch reichen, die Dateien auszutauschen. Das wären die "\DLL\_socket.pyd", "\libs\_socket.dll" und zur Sicherheit auch die "\Lib\socket.py". Das ist mal ein echtes Pythonproblem :lol: , kein BUG im Script :wink: .
Gast

Beitragvon Gast » Montag 6. September 2004, 18:47

Also ich hab Python noch nichtvorher installiert - da hast du recht !

Ich werd mal schauen ob es hilft die dateien zu tauschen - hab schon probiert einfach die python21.dll zu verschieben - aber das hat nicht geholfen .

Na ich poste nochmal wenn ich es geschafft habe !
Gast

Beitragvon Gast » Montag 6. September 2004, 19:03

Ok - hab das ganze nochmals auf eine andere Partition installiert - diesemsla scheint es gutgegangen zu sein - allerdings kommt jetzt wieder ein Script error ! :(

Traceback (most recent call last):
File "ftp.py", line 34, in ?
ftp.connect(host=ip, port=port)
File "D:\Python23\lib\ftplib.py", line 117, in connect
for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM):
socket.gaierror: (9, 'getaddrinfo failed')
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 6. September 2004, 20:06

lass dir mal mit print ip, port vor der zeile mit dem ftp.connect..., die IP und den Port ausgeben. vielleicht hast Du eine falsche IP oder einen falschen Port in der liste.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Gast

Beitragvon Gast » Dienstag 7. September 2004, 07:45

Guten Morgen !

Ich denk der fehler liegt darin das ip und port nicht gedefiniert sind ...

Code: Alles auswählen

for daten in ftp_liste:
    ip = "IP".title()
    port = "Port".title()
    user = "User".title()
    paswd = "Password".title()
    print ip, port
    ftp.connect(host=ip, port=port)
    ftp.login(user=user,passwd=paswd)
    ftp.retrlines('LIST')
    ftp.quit()


F:\Python23>python.exe ftp.py
Ip Port
Traceback (most recent call last):
File "ftp.py", line 28, in ?
ftp.connect(host=ip, port=port)
File "F:\Python23\lib\ftplib.py", line 117, in connect
for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM):
socket.gaierror: (9, 'getaddrinfo failed')

Ich denk ich hab doch irgendwas falsch gemacht ...
Gast

Beitragvon Gast » Dienstag 7. September 2004, 10:05

Ahhh hab den Fehler selbst schon gefunden - schein da was falsch begriffen zu haben . Jetzt funzt es auch !
Ein Problem ist allerdings noch da - wenn es einen timout gibt - dann bricht python ab . Das muss ich noch irgendwie abfangen ...
Gast

Beitragvon Gast » Dienstag 7. September 2004, 10:41

Es scheint eine Funktion zu geben die "ftp.all_errors" heisst allerdings bin ich mir nicht sicher ob sie hierfuer geignet ist und wie ich sie anwenden soll ?
Gast

Beitragvon Gast » Dienstag 7. September 2004, 11:26

Ok hier meine Loesung :

Code: Alles auswählen

for daten in ftp_liste:
    ip = daten["IP"]
    port = daten["Port"]
    user = daten["Username"]
    paswd = daten["Password"]
    print ip, port
    try:
        ftp.connect(host=ip, port=port)
        ftp.login(user=user,passwd=paswd)
        ftp.retrlines('LIST')
        ftp.quit()
    except ftplib.all_errors:
        print "Connection error"


Funktioniert auch prima !

Danke euch allen fuer die Hilfe !!
Gast

Beitragvon Gast » Dienstag 7. September 2004, 18:24

Na dann komt jetzt doch noch ne Frage :-)
Wie kann ich fehler mit dem in und auslesen abfangen ? Im Moment stopert er noch ueber ein paar Dinge - es waere einfacher wenn es einfach eine Fehlermeldung ausspucken wuerde und dann "weiter im Text" ?
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Dienstag 7. September 2004, 19:21

erstmal würde ich die Leseroutine robuster machen. Zumindest kann Gross/Kleinschreibung ignoriert werden. Dann kann auch überprüft werden, ob die Schlüssel erlaubt sind.

Code: Alles auswählen

allowed_keys = ["sitename", "ip", "port", "username", "password"]

def read_ftp_dicts(fname):
    """ Lese ftp-Verbindungs-daten aus der Datei 'fname' """
    ftp_daten = []
    f = file(fname,'r')
    znr = -1
    for line in f:
        znr += 1
        datas = line.split("=", 1)
        if len(datas) == 2: # line hat ein =
            key = datas[0].strip().lower() # achtung alle Schluessel klein
            if not key in allowed_keys:
                print "Unbekannter Schluessel '%s' in Zeile %i in Datei %s" % (key, znr, fname)
            else:
                value = datas[1].strip()
                if key == "sitename": # neuer Datensatz
                    ftp_daten.append({key : value})
                else: # letzten Datensatz erweitern
                    ftp_daten[-1][key] = value
    close(f)
    return ftp_daten


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Gast

Beitragvon Gast » Mittwoch 8. September 2004, 17:01

Hi !

Ja so scheint es wirklich stabiler zu sein - er stolpert immer noch ueber ein paar Datensaetze - die zum Beispiel nur 3 eintraege haben ( anonymus ) und andere an denen ich nicht sehen kann was das Problem ist . Aber das kommt nicht haeufig vor !
Darum hab ich das Program ein paar Freunden gezeigt - die fanden es auch eine gute Idee hatten aber auch noch ein paar Ideen .
Sie fanden das das Programm zu lang braucht ( ich hab keinen Timeout gesetzt ) und das ergebnis sollte besser in eine Datei geschrieben werden . Das mit der Datei - da dachte ich einfach daran es so laufen zu lassen :
ftpcheck.exe > liste.txt

Ich hab inzwischen aus dem Script eine exe gemacht ( einfacher fuer uns Windows user :-) )

Mit dem timeout bin ich noch nicht so ganz viel weiter - hab auch hier im Forum geschaut und das folgende gesehen :

ftp.sock.settimeout(30)

Allerdings funktioniert das bei mir nicht . Hab auch hier : http://pydoc.org/2.3/ftplib.html geschaut - konnte allerdings da auch nichts finden .
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 8. September 2004, 18:23

Hi auch,

bevor du da jetzt weiter machst, hab ich mal ne Frage zu der Datei mit den Informationen für die FTP-Verbindungen. Ist das Dateiformat vorgegeben oder von dir selber "ausgedacht"?
Wenn das flexibel ist, würde sich dafür eine XML-Datei anbieten. Dann könnten optionale Felder (für anonymus, z.b.) leer bleiben und es wär besser ersichtlich, welche Einträge für welche Verbindung gelten.

Code: Alles auswählen

<?xml version="1.0"?>
<FTP_Liste>
  <Connection>
    <Sitename>name</Sitename>
    <IP>127.0.0.1</IP>
    <Port>27</Port>
    <User>bla</User>
    <Password>blabla</Password>
  </Connection>
  <Connection>
    <Sitename>Suse</Sitename>
    <IP>ftp.suse.org</IP>
    <Port>27</Port>
    <User></User>
    <Password></Password>
  </Connection>
</FTP_Liste>


Die downloads könntest Du auch über Threads realisieren. Dazu gibts hier schon einen Thread.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder