Seite 1 von 1
FTP Uploadtool
Verfasst: Sonntag 8. März 2009, 14:42
von sorgenlos
Hallo Leute ich hab ein Problem mit der Dateinameübergabe,
Code: Alles auswählen
import sys, os
from ftplib import FTP
server = 'xxxx'
username = 'xxx'
password = 'xxx'
def upload(fname):
#remote_folder = "temporary" #this if the folder I want to put my files on the server
name = os.path.basename(fname) #fetch the filename alone for the remote name
name = name.replace(" ","-") #take out spaces from the name to make it nice for the web
print name
#Connect to server
ftp = FTP(server)
ftp.login(username, password)
#ftp.cwd('public_html/'+remote_folder) #hop to remote_folder
#ftp.retrlines('LIST') #print out a dir listing for good measure
#Upload the file to the server
print "Uploading...",
ftp.storbinary("STOR "+name, open(fname,"rb"))
ftp.close()
print "Done!"
upload(sys.argv[1])
Error:
Code: Alles auswählen
Traceback (most recent call last):
File "test3.pyw", line 27, in <module>
File "test3.pyw", line 23 in upload
IOError: [Errno 2] No such file or directory: 'C:\\Documents'
ftp daten muss ich aus sicherheitsgründen zensieren

Verfasst: Sonntag 8. März 2009, 14:52
von nemomuk
Naja das steht doch in der Fehlermeldung. Die Datei existiert nicht auf deinem lokalen Rechner. Der Import ist übrigens etwas seltsam. Das vertauschen von sys und os führt zu Nichts...

Verfasst: Sonntag 8. März 2009, 15:03
von sorgenlos
import war mein fehler

doppelt gemoppelt
ich glaube das problem liegt am leerzeichen was nach "Documents" kommen würde nämlich "C:\Documents and Settings\etc".
wenn ich zum beispiel eine Datei im ordner c: nehme (C:\test.txt) also ohne leerzeichen
bekomme ich ein anderen error:
Verfasst: Sonntag 8. März 2009, 15:24
von b.esser-wisser
Müsste es nicht so heißen?
Und wenn du Parameter per Kommandozeile übergibst, die Leerzeichen enthalten (können), musst du die in Anführungszeichen setzen.
Probier doch mal selber folgendes Programm mit verschiedenen Parametern:
Code: Alles auswählen
# showargs.py
import sys
for i, arg in enumerate(sys.argv):
print "%d, %s" % (i, arg)
hth, Jörg
ps.: Wäre schön, wenn du auch den Code zu den Zeilennummern zeigen würdest
edit:for _ in xrange(100):print >>self, "Du sollst keinen ungetesteten Code posten!"
Verfasst: Sonntag 8. März 2009, 15:43
von sorgenlos
quelltext und error stimmt nun alles überein
danke
b.esser-wisser, das musste fname heißen
wenn ich das script nun test mit einer datei die in "C:\Documents and Settings\Administrator\Desktop" ist dann kommt der oben genannte fehler
eine datei die beispielsweise in "C:\" ist funktioniert.
dateien aus längeren pfaden wie "C:\Python26\tcl\tcl8\8.5" funktionieren auch, das problem sind die leerzeichen..
b.esser-wisser ich verstehe den letzten ansatz von dir nicht..
Verfasst: Sonntag 8. März 2009, 15:57
von b.esser-wisser
Das sind cmd-(eigentlich Shell-) Grundlagen:
Wenn du die Datei "C:\Documents and Settings\Administrator\Desktop\test.jpg" hochladen willst, musst du das in Anführungszeichen übergeben:
Code: Alles auswählen
C:\Dokumente und Einstellungen\Administrator>upload.py "C:\Documents and Settings\Administrator\Desktop\test.jpg"
Denn ohne die Anführungszeichen sind das drei Parameter:
Code: Alles auswählen
C:\Dokumente und Einstellungen\Administrator>showargs.py C:\Documents and Settings\Administrator\Desktop\test.jpg
0, C:\Dokumente und Einstellungen\Administator\desktop\showargs.py
1, C:\Documents
2, and
3, Settings\Administrator\Desktop\test.jpg
hth, Jörg
Verfasst: Sonntag 8. März 2009, 16:10
von sorgenlos
ah ok, jetzt hab ich es verstanden

dummer fehler meinerseits
danke ich werde mich dann mal mit der implementierung ins windows kontext menu kümmern. danke
Verfasst: Mittwoch 11. März 2009, 12:47
von sorgenlos
sry wegen dem doppelpost aber ich bin am verzweifeln
Also ich erklär erstmal alles, ich habe zwei pythonscripts, das eine dient dem dateiupload und das zweite dem registrieren in der registry damit der eintrag im windows kontextmenu erscheint. funktioiert auch alles wie es sollte an einem pc mit installiertem python. sobald ich aber es mit den kompilierten versionen auf einem anderen pc versuche der kein python installiert hat kann ich nur dateien hochladen ohne leezeichen im dateipfad, bei meiner testumgebung mit python 2.5 & 2.6 funktioniert dies jedoch.
Ich verstehe nicht wieso, vielleicht liegt es daran das beim kompilieren etwas fehlt.
ich kompiliere mit 2.5, 2.6 und der neusten trunk von pyInstaller.
hier meine zwei quelltexte: ich hab die zugangasdaten in der upload.py gelassen damit ihr es selbst testen könnt wenn ihr wollt:
upload.py
Code: Alles auswählen
import sys, os
from ftplib import FTP
server = 'ftp.pyforum.py.funpic.de'
username = 'pyforum'
password = 'pyforum2'
def upload(fname):
#remote_folder = "temporary" #wunschordner
name = os.path.basename(fname) #filename fetchen
name = name.replace(" ","-") #bindestriche ersetzen fuer besseres web-handling
#Connect to server
ftp = FTP(server)
ftp.login(username, password)
#ftp.cwd('public_html/'+remote_folder) #wechsel zu remote_folder
#ftp.retrlines('LIST') #ausfuehrliches dir listing um ordnerberechtigungen zu ueberpruefen
#Upload the file to the server
#print "Hochladen...",
ftp.storbinary("STOR "+name, open(fname,"rb"))
ftp.close()
#print "Fertig!"
upload(sys.argv[1])
reg.py
Code: Alles auswählen
import sys, os
from _winreg import *
def register(command_name,association=sys.argv[0],runner="upload.exe"):
association = os.path.realpath(association)
runner = os.path.realpath(runner)
if not os.path.isfile(runner):
print "Uploader Existiert nicht! So solls sein: "+runner
return 0
try:
reg = CreateKey(HKEY_CLASSES_ROOT,"*\\Shell\\"+command_name+"\\Command")
runner_path = runner.replace("\\","\\\\")
key = runner + " %1"
print command_name+" :: "+key
SetValue(reg, "", REG_SZ, key)
CloseKey(reg)
print "erfolgreich"
except:
print "FAIL"
def unregister(command_name):
try:
if command_name=="":
return 0 #schutz um nicht komplette Registry zu loeschen HEHE
DeleteKey(HKEY_CLASSES_ROOT,"*\\Shell\\"+command_name+"\\Command")
DeleteKey(HKEY_CLASSES_ROOT,"*\\Shell\\"+command_name)
print ("Geloescht: HKEY_CLASSES_ROOT\\"+"*\\Shell\\"+command_name)
except:
print "Command "+command_name+" wurde nicht in der Registry registriert"
command_name = "Upload"
#Kein Argument?, lasst uns registrieren
if len(sys.argv)==1:
register(command_name)
#Argument -unreg ?
if len(sys.argv)==2:
if sys.argv[1] == "-unreg":
unregister(command_name)
raw_input("")
sys.exit()