FTP Uploadtool

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
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

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 :)
Zuletzt geändert von sorgenlos am Mittwoch 11. März 2009, 13:12, insgesamt 4-mal geändert.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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...;)
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

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:

Code: Alles auswählen

line 28
Indexerror: list index out of range
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Müsste es nicht so heißen?

Code: Alles auswählen

ftp.storbinary("STOR "+name, open(fname,"rb")) 
                                  ^
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!"
Zuletzt geändert von b.esser-wisser am Sonntag 8. März 2009, 16:02, insgesamt 2-mal geändert.
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

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..
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

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
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

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()

Antworten