ftplib.error_reply: 200 TYPE is now 8-bit binary

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
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

Guten Abend =)
Ich habe ein Problem mit dem ftplib modul :roll:
(Ich habe die Suchfunktion benutzt allerdings findet man unter errors nichts was bei mir geworfen wird)

Der Code der bei meinem Server nicht funktioniert:

Code: Alles auswählen

from ftplib import FTP
ftp = FTP("server")
ftp.login(user,paswd)

ftp.storbinary("STOR Server.ini", open("Config.ini", "r").write)

Fehler:
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
ftp.storbinary("STOR Server.ini", open("Config.ini", "wb").write)
File "C:\Python33\lib\ftplib.py", line 476, in storbinary
with self.transfercmd(cmd, rest) as conn:
File "C:\Python33\lib\ftplib.py", line 386, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\Python33\lib\ftplib.py", line 346, in ntransfercmd
host, port = self.makepasv()
File "C:\Python33\lib\ftplib.py", line 324, in makepasv
host, port = parse227(self.sendcmd('PASV'))
File "C:\Python33\lib\ftplib.py", line 860, in parse227
raise error_reply(resp)
ftplib.error_reply: 200 TYPE is now 8-bit binary
ok soviel zu dem Fehler der geworfen wird. Ich hab nun wirklich keine ahnung was das heißen soll :K
Der Type 200 ist jetzt eine 8-bit binary?

bei storlines kommt:

Code: Alles auswählen

ftp.storlines("STOR Server.ini", open("Config.ini", "r"))
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    ftp.storlines("STOR Server.ini", open("Config.ini", "r"))
  File "C:\Python33\lib\ftplib.py", line 497, in storlines
    with self.transfercmd(cmd) as conn:
  File "C:\Python33\lib\ftplib.py", line 386, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Python33\lib\ftplib.py", line 346, in ntransfercmd
    host, port = self.makepasv()
  File "C:\Python33\lib\ftplib.py", line 324, in makepasv
    host, port = parse227(self.sendcmd('PASV'))
  File "C:\Python33\lib\ftplib.py", line 860, in parse227
    raise error_reply(resp)
ftplib.error_reply: 200 TYPE is now ASCII
scheint als wäre es umgewandelt worden :?

Edit: Ich versuche eine .cfg Datei Hochzuladen ;)

Ich hoffe ihr könnt mir helfen, denn ich bin überfragt :oops:
mfg Trayser
BlackJack

@TrayserCassa: Mal abgesehen davon das Quelltext und Traceback offensichtlich nicht zusammengehören solltest Du vielleicht noch mal in der Dokumentation nachschauen was die Methode(n) als zweites Argument erwarten.

Und Dateien sollte man auch wieder schliessen. Dazu muss man an einen Namen binden. Am besten verwendet man die ``with``-Anweisung dazu.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

Der Fehler und Python Code gehören zusammen habe es nur getrennt und beim zweiten vergessen :D

meine Versuche: :oops:
Die Documentation sagt:
storbinary(command, file[, blocksize, callback, rest])¶

Store a file in binary transfer mode. command should be an appropriate STOR command: "STOR filename". file is an open file object which is read until EOF using its read() method in blocks of size blocksize to provide the data to be stored. The blocksize argument defaults to 8192. callback is an optional single parameter callable that is called on each block of data after it is sent. rest means the same thing as in the transfercmd() method.

If the server does not recognize the REST command, an error_reply exception will be raised. If this happens, simply call transfercmd() without a rest argument.
Das habe ich und lasse rest weg. Dabei fällt mir auch auf das die Argumente von retrbinary ganz anders sind :roll:

Code: Alles auswählen

>>> with open("Config.ini", "r") as f: 
    print(f.read())

>>> print(f)
<_io.TextIOWrapper name='Config.ini' mode='r' encoding='cp1252'>
>>> ftp.storbinary("STOR Server.ini", f).write)
SyntaxError: invalid syntax
>>> ftp.storbinary("STOR Server.ini", f)
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    ftp.storbinary("STOR Server.ini", f)
  File "C:\Python33\lib\ftplib.py", line 478, in storbinary
    buf = fp.read(blocksize)
ValueError: I/O operation on closed file.
>>> print(f)
<_io.TextIOWrapper name='Config.ini' mode='r' encoding='cp1252'>
>>> with open("Config.ini", "r") as f:
	ftp.storbinary("STOR Server.ini", f)

	
Traceback (most recent call last):
  File "<pyshell#14>", line 2, in <module>
    ftp.storbinary("STOR Server.ini", f)
  File "C:\Python33\lib\ftplib.py", line 476, in storbinary
    with self.transfercmd(cmd, rest) as conn:
  File "C:\Python33\lib\ftplib.py", line 386, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Python33\lib\ftplib.py", line 346, in ntransfercmd
    host, port = self.makepasv()
  File "C:\Python33\lib\ftplib.py", line 324, in makepasv
    host, port = parse227(self.sendcmd('PASV'))
  File "C:\Python33\lib\ftplib.py", line 860, in parse227
    raise error_reply(resp)
ftplib.error_reply: 200 TYPE is now 8-bit binary
>>> with open("Config.ini", "r") as f:
	ftp.storbinary("STOR Server.ini", f).write

	
Traceback (most recent call last):
  File "<pyshell#16>", line 2, in <module>
    ftp.storbinary("STOR Server.ini", f).write
  File "C:\Python33\lib\ftplib.py", line 476, in storbinary
    with self.transfercmd(cmd, rest) as conn:
  File "C:\Python33\lib\ftplib.py", line 386, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Python33\lib\ftplib.py", line 346, in ntransfercmd
    host, port = self.makepasv()
  File "C:\Python33\lib\ftplib.py", line 324, in makepasv
    host, port = parse227(self.sendcmd('PASV'))
  File "C:\Python33\lib\ftplib.py", line 860, in parse227
    raise error_reply(resp)
ftplib.error_reply: 200 TYPE is now 8-bit binary
>>> with open("Config.ini", "r").write as f:
	ftp.storbinary("STOR Server.ini", f)

	
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    with open("Config.ini", "r").write as f:
AttributeError: __exit__
>>> ftp.storbinary("STOR", "Owner.cfg")
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    ftp.storbinary("STOR", "Owner.cfg")
  File "C:\Python33\lib\ftplib.py", line 476, in storbinary
    with self.transfercmd(cmd, rest) as conn:
  File "C:\Python33\lib\ftplib.py", line 386, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Python33\lib\ftplib.py", line 346, in ntransfercmd
    host, port = self.makepasv()
  File "C:\Python33\lib\ftplib.py", line 324, in makepasv
    host, port = parse227(self.sendcmd('PASV'))
  File "C:\Python33\lib\ftplib.py", line 860, in parse227
    raise error_reply(resp)
ftplib.error_reply: 200 TYPE is now 8-bit binary
>>> ftp.storbinary("STOR Owner.cfg", "Owner.cfg")
Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    ftp.storbinary("STOR Owner.cfg", "Owner.cfg")
  File "C:\Python33\lib\ftplib.py", line 476, in storbinary
    with self.transfercmd(cmd, rest) as conn:
  File "C:\Python33\lib\ftplib.py", line 386, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Python33\lib\ftplib.py", line 346, in ntransfercmd
    host, port = self.makepasv()
  File "C:\Python33\lib\ftplib.py", line 324, in makepasv
    host, port = parse227(self.sendcmd('PASV'))
  File "C:\Python33\lib\ftplib.py", line 860, in parse227
    raise error_reply(resp)
ftplib.error_reply: 200 TYPE is now 8-bit binary
>>> ftp.storbinary("STOR", "Owner.cfg"[, "100", "Owner.cfg"])
SyntaxError: invalid syntax
>>> ftp.storbinary("STOR", "Owner.cfg", ["100", "Owner.cfg"])
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    ftp.storbinary("STOR", "Owner.cfg", ["100", "Owner.cfg"])
  File "C:\Python33\lib\ftplib.py", line 476, in storbinary
    with self.transfercmd(cmd, rest) as conn:
  File "C:\Python33\lib\ftplib.py", line 386, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Python33\lib\ftplib.py", line 346, in ntransfercmd
    host, port = self.makepasv()
  File "C:\Python33\lib\ftplib.py", line 324, in makepasv
    host, port = parse227(self.sendcmd('PASV'))
  File "C:\Python33\lib\ftplib.py", line 860, in parse227
    raise error_reply(resp)
ftplib.error_reply: 200 TYPE is now 8-bit binary
>>> 


Magst du mir mal ein bespiel schreiben, denn die Docu dachte es reicht wenn wir retrlines als beispiel benutzen. :D

Google Nachweis:

Code: Alles auswählen

import ftplib
session = ftplib.FTP('server.address.com','USERNAME','PASSWORD')
file = open('kitten.jpg','rb')                  # file to send
session.storbinary('STOR kitten.jpg', file)     # send the file
file.close()                                    # close file and FTP
session.quit()
das kommt bei mir:

Code: Alles auswählen

>>> file = open('Owner.cfg', "r")
>>> print(file)
<_io.TextIOWrapper name='Owner.cfg' mode='r' encoding='cp1252'>
>>> ftp.storbinary('STOR kitten.cfg', file)
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    ftp.storbinary('STOR kitten.cfg', file)
  File "C:\Python33\lib\ftplib.py", line 476, in storbinary
    with self.transfercmd(cmd, rest) as conn:
  File "C:\Python33\lib\ftplib.py", line 386, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Python33\lib\ftplib.py", line 346, in ntransfercmd
    host, port = self.makepasv()
  File "C:\Python33\lib\ftplib.py", line 324, in makepasv
    host, port = parse227(self.sendcmd('PASV'))
  File "C:\Python33\lib\ftplib.py", line 860, in parse227
    raise error_reply(resp)
ftplib.error_reply: 200 TYPE is now 8-bit binary
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Einmal öffnest du Binär- und einmal im Textmodus.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@TrayserCassa: Traceback und Code gehören nicht zusammen weil im Quelltext etwas anderes steht als in den Zeilen die im Traceback gelistet werden. Es macht schon einen Unterschied ob man eine Datei im Binärmodus öffnet oder nicht, und wenn im Quelltext das eine zu sehen ist und um Traceback etwas anderes, dann frage ich mich halt was noch alles unterschlagen oder „gefälscht” wurde.

Zu den erneuten Versuchen:

Du öffnest eine Datei mit ``with``, liest den Inhalt — damit kann man die Datei so schon mal nicht mehr für den Aufruf zum kopieren auf den FTP-Server verwenden, weil der Dateizeiger durch das lesen nun am Dateiende steht und jeder weitere Leseversuch nur eine leere Zeichenkette ergibt. Und dann ist der ``with``-Block zuende und damit die Datei wieder geschlossen. Was dann auch zur entsprechenden Ausnahme führt.

Beim nächsten Versuch ab Zeile 17 passt die im Textmodus geöffnete Datei nicht zum `storbinary()`.

Der Versuch am Zeile 35 sieht nach wild herum raten aus. Kannst Du mal erklären was das Deiner Meinung nach bewirken sollte?

Ab 53 wird es noch abenteuerlicher. Programmieren bedeutet nicht das man unüberlegt alle Möglichkeiten durchprobiert bis irgendwas funkioniert, man aber gar nicht weiss warum.

Die Schreiber von der Dokumentation gingen davon aus das man nicht für alles ein Beispiel zum abschreiben braucht, sondern dass da ein denkender Programmierer sitzt der weiss was er tut.

Im Beispiel von Stackoverflow wird die Datei im Binärmodus geöffnet. Und bei mir klappt das auch einwandfrei:

Code: Alles auswählen

In [8]: ftp = ftplib.FTP('10.0.0.29', 'user', 'password')

In [9]: with open('test.jpg', 'rb') as f:
   ...:    ftp.storbinary('STOR test.jpg', f)

In [10]: ftp.close()
Die ”Fehlermeldung” ist aber auch eigenartig, denn die FTP-Anwort-Codes die mit 2 anfangen sind keine Fehler sondern positive Rückmeldungen. So etwas dürfte Dir eigentlich gar nicht als Ausnahme um die Ohren fliegen. Du benutzt nicht zufällig irgendeine dumme IDE die Ausnahmen irgendwo über ``except``\s ”rüber hilft” wo sie eigentlich nie drüber hinaus kommen dürften?
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

Mit with hab ich verstanden und benutzt. Danke für den Hinweiß :wink:

Ja aus lauter verzweiflung habe ich geraten :oops: wenn es funktioniert dann weiß ich auch wie und präge mir das ein.

Ich benutzte die Ide von Python3.3 und weiß auch wo der fehler war :oops:
kommt davon wenn man sich die Datei die man hochladen will nicht anschaut :roll:
Die ini Datei war leer :roll:

Code: Alles auswählen

>>> with open("Owner.ini", "rb") as file:
	ftp.storbinary("STOR test.ini", file)

	
'226-0 Kbytes used (0%) - authorized: 2097152 Kb\n226-File successfully transferred\n226 0.167 seconds (measured here), 0.53 Kbytes per second'
>>> 
Immerhin wieder was neues gelernt :D
Vielen Dank für die schnelle hilfe und fürs verständniss :)
BlackJack

@TrayserCassa: Das war ganz sicher nicht der Fehler denn selbstverständlich kann man auch problemlos leere Dateien ohne Fehler auf einen FTP-Server hoch laden:

Code: Alles auswählen

In [21]: !touch test.txt

In [22]: !cat test.txt

In [23]: !ls -l test.txt
-rw-rw-r-- 1 bj bj 0 Dec  9 22:06 test.txt

In [24]: ftp = ftplib.FTP('10.0.0.29', 'user', 'password')

In [25]: with open('test.txt', 'rb') as f:
   ....:    ftp.storbinary('STOR test.txt', f)

In [26]: ftp.close()
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

Naja habe die Datei gefüllt und das Ergebniss habe ich gepostet. Die Leeren Dateien waren auch vorhanden aber warum wirft er dann ein Error?

mfg Trayser
BlackJack

@TrayserCassa: Es wird ja keine Ausname ausgelöst. Ausser bei *Dir*. Eine Vermutung warum habe ich ja schon angestellt. Etwas anderes kann ich mir auch nicht vorstellen.
Antworten