Seite 1 von 1

Bilderupload auf FTP Server

Verfasst: Sonntag 14. Dezember 2014, 22:44
von tomtee
Hallo, ich bin über den Raspberry Pi zu Python gekommen und noch blutiger Anfänger. In meinem Projekt möchte ich mit der Kamera des Raspberry Bilder auf einen Ftp Server hochladen und diese Bilder sollen mit einem Index versehen sein, also Bild1.jpg, Bild2.jpg u.s.w, in diesem Fall von 2 bis 10, wobei die älteren Bilder von den neueren mit gleichem Index überschrieben werden sollen, damit sich nicht zu viele Bilder auf dem Server ansammeln.
Der upload ohne Index funktioniert auch einwandfrei, aber mit der Indizierung hab ich Probleme. Es liegt wohl an dem Namen, den ich der Funktion Upload() übergebe, aber ich hab keine Ahnung, wie ich das richtig machen könnte und hab leider auch in den einschlägigen Büchern nichts gefunden. Wenn mir da jemand weiterhelfen könnte, wäre ich sehr dankbar.

Code: Alles auswählen

#!/usr/bin/python
# coding=utf-8
import time, sys
import picamera
import ftplib

cam = picamera.PiCamera()
cam.resolution = (800, 600)
cam.rotation = 180
nummer = 1
newfilename=['bild02%d.jpg' % nummer]

def upload():
	session = ftplib.FTP ('ftp.server.com' , 'benutzername' , 'passwort' )
	directory = "/"
	session.cwd(directory)
	file = open('newfilename' , 'rb')
	session.storbinary('STOR newfilename' , file)
	file.close()
	session.quit()
	return
	
try:
    while True:
		cam.capture(newfilename)
		
		nummer += 1
		time.sleep(15)
		if nummer==11:
			nummer=1
			upload()
		else:	
			upload()
		
except KeyboardInterrupt:
	cam.close()
	sys.exit()

Re: Bilderupload auf FTP Server

Verfasst: Montag 15. Dezember 2014, 08:14
von Sirius3
@tomtee: es gibt einen Unterschied zwischen dem Literalen String 'newfilename' und der Variable newfilename. In Zeile 17 und 18 wird nicht auf magische Weise ein String durch den Inhalt einer Variable ersetzt. Warum ist newfilename eine Liste mit einem Element?

Einrücktiefe ist in Python immer 4 Leerzeichen und nicht mal 8, mal 12. Wenn die gleiche Zeile im if- und im else-Teil vorkommt, kann man sie auch einfach einmal dahinter schreiben. upload sollte als Parameter noch newfilename erhalten.

Re: Bilderupload auf FTP Server

Verfasst: Montag 15. Dezember 2014, 09:38
von tomtee
Das mit den Einrückungen ist klar, das mache ich auch gleich anders.
Meine frage ist, glaube ich, die nach der magischen Weise, in der die Variable mit dem String, der ja eigentlich den Index enthalten soll, korrespondiert, bzw habe ich das jetzt so verstanden, dass ich es einfacher machen kann, wenn ich einfach von

Code: Alles auswählen

cam.capture('bild.jpg')
'bild.jpg' an upload() übergebe und nur den Dateinamen ,also den string verändere?

Re: Bilderupload auf FTP Server

Verfasst: Montag 15. Dezember 2014, 16:39
von lackschuh
@tomtee

Schau mal in der Doku von picamera nach. picamera bietet von Haus aus einen Iterator an, welchen du mit folgenden zwei Platzhaltern aufrufen kannst:
- {counter}
- {timestamp}

Also 'image{counter}.jpg' oder 'image{counter:02d}.jpg'

Re: Bilderupload auf FTP Server

Verfasst: Dienstag 16. Dezember 2014, 08:37
von mutetella
@tomtee
In Fällen, in denen ich nicht genau weiß, warum etwas nicht wie erwartet funktioniert, versuche ich während dem Programmlauf an Informationen zu kommen. Das einfachste Mittel dazu ist ``print``. Du könntest also einfach mal zur Laufzeit Werte anzeigen lassen um zu sehen, was da passiert:

Code: Alles auswählen

def upload():
        session = ftplib.FTP('ftp.server.com' , 'benutzername' , 'passwort' )
        directory = "/"
        session.cwd(directory)
        file_ = open('newfilename' , 'rb')
        print file_.name
        session.storbinary('STOR newfilename' , file_)
        file_.close()
        session.quit()
        return
Noch was: Beim Aufruf einer Funktion, Methode oder Klasse gehört zwischen Name und öffnender Klammer kein Leerzeichen. Ist zwar kein Fehler, macht man aber nicht.
``file`` ist der Name einer builtin Funktion und sollte nicht überschrieben werden. Bei einem Namenskonflikt kannst Du entweder dem Namen einen Unterstrich anhängen oder aber besser noch, Du überlegst Dir einen anderen Namen.

Wenn Dir ``print`` irgendwann einmal für Debugzwecke nicht mehr ausreicht, solltest Du einen Blick ins pdb-Modul werfen. Nach meiner Frau die wichtigste Entdeckung meines Lebens! :mrgreen:

mutetella