FTP Download nach Datum

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.
Manne_Manta
User
Beiträge: 39
Registriert: Dienstag 5. Mai 2009, 11:26

Mittwoch 6. Februar 2013, 08:33

Wenn ich Dich richtig verstehe müsste der Code so aussehen:

Code: Alles auswählen

FTP = TimeFTP(parsed.netloc,username, '',password,'','','')
Er bringt damit aber folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\PASU_FTP_Export\Sourcecode\testmini", line 8, in <module>
    timeftpx.get_last_modified('host', '*.dat', 2, 'C:\user', 'pasu','tvpu')
  File "C:\Python27\lib\timeftpx.py", line 29, in get_last_modified
    FTP = TimeFTP(parsed.netloc,username, '',password,'','','')
  File "build\bdist.win32\egg\pysftp.py", line 55, in __init__
    self._transport = paramiko.Transport((host, port))
  File "build\bdist.win32\egg\paramiko\transport.py", line 291, in __init__
    sock.connect((hostname, port))
  File "C:\Python27\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
TypeError: an integer is required
Wo wird jetzt eine Zahl benötigt?
BlackJack

Mittwoch 6. Februar 2013, 09:51

@Manne_Manta: Du solltest vielleicht mal aufhören zu raten und anfangen Dich mit der Materie auseinander zu setzen. Wenn man sich den Stapelabzug anschaut läuft es darauf hinaus das ein `socket.socket`-Objekt mit dem Hostnamen und der Portnummer erzeugt werden soll. Informiere Dich was Sockets sind und welches dieser beiden Argumente eine Zahl sein muss. Und dann schau Dir Deinen Aufruf an, und Du wirst feststellen wo Du statt einer Zahl etwas anderes übergibst.

Und nein, so meinte ich das mit dem Aufruf nicht. Du sollst nicht einfach irgendwas übergeben, und auch nicht alles mit Werten belegen, sondern nur gezielt die Argumente, wo Du nicht den Default-Wert haben möchtest. Dazu könntest Du Dir in der Python-Dokumentation erarbeiten wie das mit Argumenten, Default-Argumenten, und Funktionsaufrufen in Python funktioniert.
Manne_Manta
User
Beiträge: 39
Registriert: Dienstag 5. Mai 2009, 11:26

Freitag 8. Februar 2013, 08:26

Wenn ich richtig recherchiert habe ist es wie folgt:

Die Parameter bei denen ich den Default Wert benutzen möchte übergebe ich nicht.
Python benötigt die Parameter, wenn Sie nicht benannt sind nach der im Aufruf stehenden Reihenfolge, wenn die
Parameter benannt sind wird der Namen des Parameters benutzt.

Das heißt für mich. Wenn ich im Funktionsaufruf die Parameter

Code: Alles auswählen

timeftpx.get_last_modified(host, '*.dat', 2, 'C:\user', username,password)
an

Code: Alles auswählen

def get_last_modified(host="", pattern='*', no=1, dest='.', username='', password='')

übergebe müsste das eigentlich passen.
Benutzeravatar
sparrow
User
Beiträge: 825
Registriert: Freitag 17. April 2009, 10:28

Freitag 8. Februar 2013, 12:29

Nein, weil da ja gar nicht der Fehler aufgetreten ist, sondern bei der Instanzierung der Klasse TimeFTP, die von pysftp.Connection erbt und daher bestimmte Argumente beim Initialisieren erwartet, die du aber nicht oder falsch angibst.
Welche Argumente, in welcher Reihenfolge das sind (und wie sie heißen, und was der Default-Wert ist) hast du hier im Thread schon gepostet. Der Post beginnt mit "Dann kommt das hier", und das was da kommt, dass solltest du auch wirklich lesen.
Manne_Manta
User
Beiträge: 39
Registriert: Dienstag 5. Mai 2009, 11:26

Freitag 8. Februar 2013, 13:59

Ich blicks nicht.
Das Initialisieren der Argumente geschieht doch in:

Code: Alles auswählen

def get_last_modified(host,username,password,private_key='', port='', private_key_pass='', log=''):
Nur wie bekomm ich die Default Argumente aus pysftp dort rein. So wie ichs gemacht habe funktionierts auf jeden Fall nicht. wenn ich

Code: Alles auswählen

print port
eingebe dann kommt da nichts.
Wie komme ich denn nun an die Default Werte?
Wenn ich z.B. http://effbot.org/zone/default-values.htm das hier lese, finde ich nichts was ich auf mein Problem anwenden kann, da die Default Werte ja von pysftp kommen.
Benutzeravatar
sparrow
User
Beiträge: 825
Registriert: Freitag 17. April 2009, 10:28

Freitag 8. Februar 2013, 16:26

Das ist die kaputte Zeile:

Code: Alles auswählen

FTP = TimeFTP(parsed.netloc, user, pw)
Darin initialisierst du eine Object vom Typ TimeFTP, und das was du da in den Klammern als Argumente mit gibst ist falsch.
So weit waren wir doch schon einmal, ich weiß gar nicht wie du jetzt auf den Aufruf von get_last_modified als Fehlerquelle kommst.
Manne_Manta
User
Beiträge: 39
Registriert: Dienstag 5. Mai 2009, 11:26

Montag 11. Februar 2013, 06:55

Die Zeile habe ich schon angepasst:

Code: Alles auswählen

ftp = TimeFTP(parsed.netloc, username,private_key, password,port,private_key_pass,log)
Der fehler lautet trotzdem so:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\PASU_FTP_Export\Sourcecode\testmini", line 16, in <module>
    timeftpx.get_last_modified(host,username,password,private_key='', port='', private_key_pass='', log='')
  File "C:\Python27\lib\timeftpx.py", line 41, in get_last_modified
    ftp = TimeFTP(parsed.netloc, username,private_key, password,port,private_key_pass,log)
  File "build\bdist.win32\egg\pysftp.py", line 55, in __init__
    self._transport = paramiko.Transport((host, port))
  File "build\bdist.win32\egg\paramiko\transport.py", line 291, in __init__
    sock.connect((hostname, port))
  File "C:\Python27\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
TypeError: an integer is required
>>> 
Benutzeravatar
sparrow
User
Beiträge: 825
Registriert: Freitag 17. April 2009, 10:28

Montag 11. Februar 2013, 09:34

Die Parameter brauchen aber schon sinnvolle Werte. Du übergibst aber leere Strings.
Das sagt die Fehlermeldungn ja auch: "Ich hätte gerne eine Zahl", du gibst "Zeichenkette", zudem noch leer.

Zumindest port scheint demnach also nicht das zu sein, was das Programm erwartet.
Manne_Manta
User
Beiträge: 39
Registriert: Dienstag 5. Mai 2009, 11:26

Dienstag 12. Februar 2013, 11:58

Das Problem mit dem,dass ich Port als String angegeben habe, habe ich gefixt.
Jetzt kommt natürlich sofort die nächste Fehlermeldung:

Code: Alles auswählen

 Traceback (most recent call last):
  File "C:\test\Sourcecode\testmini", line 20, in <module>
    timeftpx.get_last_modified(host,username,password,port,log)
  File "C:\Python27\lib\timeftpx.py", line 42, in get_last_modified
    ftp = TimeFTP(parsed.netloc, username,private_key, password,port,private_key_pass,log)
  File "build\bdist.win32\egg\pysftp.py", line 46, in __init__
    username = os.environ['LOGNAME']
  File "C:\Python27\lib\os.py", line 423, in __getitem__
    return self.data[key.upper()]
KeyError: 'LOGNAME'
Hat das jetzt mit dem von mir als String parametrierten 'log' was zu tun?
Sirius3
User
Beiträge: 8120
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 12. Februar 2013, 12:01

Was steht denn da?
in der Zeile

Code: Alles auswählen

username = os.environ['LOGNAME']
gibt es den Schlüssel-nicht-gefunden-Fehler:

Code: Alles auswählen

KeyError: 'LOGNAME'
Was könnte das wohl heißen?
Manne_Manta
User
Beiträge: 39
Registriert: Dienstag 5. Mai 2009, 11:26

Freitag 15. Februar 2013, 09:22

Jetzt bin ich immehin mal ein bisschen weiter.

Ich habe

Code: Alles auswählen

for filename in self.nlst(pattern):
durch

Code: Alles auswählen

for filename in self.listdir(pattern):
ersetzt, da pysftp 'nlst' nicht kennt.
Dann hab ich noch

Code: Alles auswählen

ftp.cwd(parsed.path)
durch

Code: Alles auswählen

ftp.chdir(parsed.path)
ersetzt, da es sonst zur Fehlermeldung

Code: Alles auswählen

AttributeError: 'TimeFTP' object has no attribute 'cwd'
kommt.

Jetzt hab ich aber eine weitere Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\test\Sourcecode\testmini", line 23, in <module>
    timeftpx.get_last_modified(host,username,private_key,password,port,private_key_pass,log, '*.dat', 2, 'C:\user')
  File "C:\Python27\lib\timeftpx.py", line 50, in get_last_modified
    for filename, timestruct in list(ftp.last_modified(pattern))[-no:]:
  File "C:\Python27\lib\timeftpx.py", line 18, in last_modified
    for filename in self.listdir(pattern):
  File "build\bdist.win32\egg\pysftp.py", line 122, in listdir
    return self._sftp.listdir(path)
  File "build\bdist.win32\egg\paramiko\sftp_client.py", line 150, in listdir
    return [f.filename for f in self.listdir_attr(path)]
  File "build\bdist.win32\egg\paramiko\sftp_client.py", line 173, in listdir_attr
    t, msg = self._request(CMD_OPENDIR, path)
  File "build\bdist.win32\egg\paramiko\sftp_client.py", line 635, in _request
    return self._read_response(num)
  File "build\bdist.win32\egg\paramiko\sftp_client.py", line 682, in _read_response
    self._convert_status(msg)
  File "build\bdist.win32\egg\paramiko\sftp_client.py", line 708, in _convert_status
    raise IOError(errno.ENOENT, text)
IOError: [Errno 2] No such file
Ist das diese Zeile, die dazu führt?

Code: Alles auswählen

for filename, timestruct in list(ftp.last_modified(pattern))[-no:]:
Benutzeravatar
snafu
User
Beiträge: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Freitag 15. Februar 2013, 09:53

Würde sagen, eins später. Denn die `.listdir()`-Methode der verwendeten Klasse nimmt vermutlich kein Pattern, sondern einen konkreten Verzeichnisnamen an. Unter Pattern verstehe ich etwas wie `*.py`, wo halt noch eine Übersetzung in tatsächliche Dateinamen gemacht werden muss.

Du müsstest also entweder nur `filename` bzw `path` statt `pattern` als Argument in deiner eigenen Methode annehmen oder aber, du rufst `.listdir()` in einer Schleife auf und übersetzt vorab `pattern` mittels glob() in eine Liste von aufgelösten Pfadangaben.
shcol (Repo | Doc | PyPi)
Antworten