FTP-Speedtester

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Sonntag 5. September 2004, 10:15

Hiho Gemeinde,

Bin relativ neu mit python und habe heute mit eurer Hilfe mein erstes Programm mehr oder weniger fertig geschrieben:

Code: Alles auswählen

def handleDownload(block):
         aa = open('c:/qq.txt', 'wb')
         global datei
         aa.write(block)
         aa.close()

def funktionsname():
	import os
	s1=os.path.getsize(r'C:\qq.txt')
	time.sleep(1)
	s2=os.path.getsize(r'C:\qq.txt')
	file = open('c:/qq1.txt', 'r+')
	file.write('  ')
        file.write(speed)
        speed = s2-s1
        file.close()
def connect():
	try:
		from ftplib import FTP
		global datei
		IP=raw_input('IP')
		ftp = FTP(IP)
		ftp.login()
		q = ftp.retrlines('LIST')
		if(q=='226 Transfer complete.'):
			file = open('c:/qq1.txt', 'w+')
			file.write(IP)
			try:
				ftp.storbinary('STOR 1MB.txt', open('c:/1MB.txt','rb',1024))
				try:
					ftp.retrbinary('RETR '+"1MB.txt", handleDownload)
	                                import thread
                                        thread.start_new_thread(funktionsname, ())
				except:
					print 'Download fehlgeschlagen'
			except:
				print 'Schreiben fehlgeschlagen!'
		else:
			print 'Kein anonymous Zugang'
	except:
		print 'Kein anonymous Zugang'
connect()
das problem ist das noch kein eintrag bezüglich des speeds vorgenommen wird... evtl. könnte mir da einer nen tipp geben? danke...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Sonntag 5. September 2004, 12:28

Hi Iopodx,

uiuiui, daß du funkelniegelnagelneu bei Python bist merkt man am Code ;)

Erst mal ein paar kleine Tipps was du so besser machen kannst.

Zuallererst, stell deinen Editor so ein, daß er bei druck auf die Tabulatortaste statt eines Tabulators ein paar Leerzeichen in den Text einfügt. Üblich sind 4 Leerzeichen, du kannst aber auch 2,3,5 oder 6 nehmen. Dann funktioniert auch die Funktion "funktionsname", die dir, so wie sie gepostet ist, um die Ohren fliegt.

Jetzt zu den einzelnen Programmeilen:

Code: Alles auswählen

def handleDownload(block):
         aa = open('c:/qq.txt', 'wb')
         global datei
         aa.write(block)
         aa.close()
"Nomen est Omen" gilt hier schonmal nicht. Die Funktion speichert einfach Daten in eine Datei, das hat mit einem Handeln eines Downloads nix zu tun.
Einrückung mit 9 Spaces ist auch recht heftig.
aa = open('c:/qq.txt', 'wb') kann bei mir schonmal nicht laufen. Da fragt sich mein Linuxrechner "Who to fu.. is c: ?" ;)
wozu definierst Du global datei? "datei" wird nirgends in der Funktion benötigt.

Code: Alles auswählen

def funktionsname():
    import os
    s1=os.path.getsize(r'C:\qq.txt')
    time.sleep(1)
    s2=os.path.getsize(r'C:\qq.txt')
    file = open('c:/qq1.txt', 'r+')
    file.write('  ')
        file.write(speed)
        speed = s2-s1
        file.close() 
Hier passt die Einrückung schonmal nicht, gibt nen Syntaxerror. Der Name der Funktion ist auch wieder irreführend. Du verwendest 2x "C:\qq.txt" das gehört entweder in eine globale Variable oder wird der Funktion als Parameter übergeben. "C:\" gibts bei mir natürlich wieder nicht.

Code: Alles auswählen

def connect():
    try:
        from ftplib import FTP
        global datei
        IP=raw_input('IP')
        ftp = FTP(IP)
        ftp.login()
        q = ftp.retrlines('LIST')
        if(q=='226 Transfer complete.'):
            file = open('c:/qq1.txt', 'w+')
            file.write(IP)
            try:
                ftp.storbinary('STOR 1MB.txt', open('c:/1MB.txt','rb',1024))
                try:
                    ftp.retrbinary('RETR '+"1MB.txt", handleDownload)
                                    import thread
                                        thread.start_new_thread(funktionsname, ())
                except:
                    print 'Download fehlgeschlagen'
            except:
                print 'Schreiben fehlgeschlagen!'
        else:
            print 'Kein anonymous Zugang'
    except:
        print 'Kein anonymous Zugang'
Wieder probleme mit den Einrückungen.
import gehören an den Anfang vom Script, nicht irgendwo verteilt im Code!
Alles in ein try...except einzuschließen ist auch nicht so gut, da bekommt man keine Fehlermeldungen vom Pythoninterpreter geliefert.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Sonntag 5. September 2004, 12:50

Also erstmal vielen Dank für die schnelle Antwort! Werde es gleich verbessern.. Aber alles in ein Try einzuschließen hat den Grund dass, das Programm nicht abstürzen darf wenn es keine Verbindung zum FTP bekommt...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Sonntag 5. September 2004, 13:16

wirklich abstürzen tun Pythonprogramme sehr selten. "Kontrollierte Bruchlandungen" kommen schon mal vor ;)
Du kannst auch speziell die FTP-Fehler abfangen mit try...except.

Code: Alles auswählen

import thread
from ftplib import FTP, Error

def connect():
    IP=raw_input('IP')
    try:
        ftp = FTP(IP)
        ftp.login()
    except Error:
        print "Kein anonumous Zugang!"
        return
    try:
        q = ftp.retrlines('LIST')
    except Error:
        ftp.close()
        print "LIST fehlgeschlagen!"
        return
    if(q=='226 Transfer complete.'):
        f = open('c:/qq1.txt', 'w+')
        f.write(IP)
        try:
            ftp.storbinary('STOR 1MB.txt', open('c:/1MB.txt','rb',1024))
        except Error:
            ftp.close()
            f.close()
            print "STOR fehlgeschlagen!"
        try:
            ftp.retrbinary('RETR '+"1MB.txt", handleDownload)
            thread.start_new_thread(funktionsname, ())
        except Error:
            print 'Download fehlgeschlagen'
    else:
        print "LIST fehlgeschlagen:", q
    ftp.close()
    f.close()
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Sonntag 5. September 2004, 13:21

cool thx :) perfekt :).. jetzt hab ich noch eine frage: Kann ich das komplette ergebnis des List-Commands in einer bzw mehreren Variablen speichern lassen?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Sonntag 5. September 2004, 13:45

am einfachsten kannst Du das Ergebnis von "LIST" in eine Liste ausgeben lassen

Code: Alles auswählen

        datei_liste = []
        q = ftp.retrlines("LIST", datei_liste.append)
Dookie
[code]#!/usr/bin/env python
import this[/code]
Antworten