Übers Netzwerk eine Datei verschieben/ kopieren

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
r12w04
User
Beiträge: 6
Registriert: Freitag 30. Mai 2014, 11:20

Servus Leute.

Ich bin ziemlich neu in der Python Programmierung.

Zuerst mein Aufbau.

Ich habe mir 3 Raspberry Pi´s und 2 Kameramodule besorgt.

Die Pi´s sind unteranander in einem eigenen Netzwerk verbunden.
Einen Raspberry habe ich eine Festplatte verbunden und benutze als ein NAS Laufwerk.
Mit den anderen beiden Pi´s habe ich die Kameramodule instaliert. Mit Python habe ich einen Script geschrieben wo die Kameras per einem Schleßer (GPIO Eingang) ein Foto machen.
Das war mit der Dokumentation vom Raspberry einfach.

Jetzt möchte ich das die Fotos auf das NAS Laufwerk in ein bestimten Ordener abgelegt werden.

Per manuelle eingabe "scp ~/bild_n.jpg pi@192.168.178.21:/share/Public/Pikamera/bild_n.jpg" kommt noch eine aufforderung einen Passwort einzugeben.
Danach wird mir das Bild in das Verzeichnis kopiert.
Mit der eingabe "rm bild_n.jpg" wird dann das Bild lokal am Pi gelöscht.

Die Pi´s habe eine feste IP Adresse. Also da ändert sich nichts.

Wie kann man das in den Script mit reinschreiben damit die zwei Pi´s das Bild automatisch auf das Verzeichnis kopiert/verschiebt?

Danke

Mit freundlichen Grüßen
r12w04
BlackJack

@r12w04: Wenn Du einen RPi als NAS einrichten willst, dann ist das letztendlich gar keine Python-Frage. Denn bei einem NAS richtet man ja üblicherweise eine NFS- oder SMB-Freigabe ein, die dann auf anderen Geräten „gemounted” wird, also aus der Sicht von Programmen einfach als Verzeichnis erscheint.
r12w04
User
Beiträge: 6
Registriert: Freitag 30. Mai 2014, 11:20

Danke für die schnelle Antwort

ja einer leuft als nas mit Samba da haben Sie recht. aber die anderen sollen das bild per Script auf den NAS abspeichern.

Mit freundlichen Grüßen
r12w04
BlackJack

@r12w04: Na dann müssen die halt einfach das Bild im entsprechenden Verzeichnis ablegen.
r12w04
User
Beiträge: 6
Registriert: Freitag 30. Mai 2014, 11:20

ja und wie macht man das ?
BlackJack

@r12w04: Na Du speicherst einfach das Bild direkt auf die Freigabe. Wie man das *genau* macht, hängt von dem Code ab den Du zum speichern benutzt. Falls Du beispielsweise das `picamera`-Modul verwendest, gibst Du beim `capture()`-Aufruf nicht nur den Dateinamen an, sondern den kompletten Pfad wo gespeichert werden soll.
r12w04
User
Beiträge: 6
Registriert: Freitag 30. Mai 2014, 11:20

Servus.
Wenn ich das so in dem Script reinschreibe

import time
import picamera)
with picamera.PiCamera() as camera:
camera.resolution = (2592, 1944)
time.sleep(0.01)
camera.capture('pi@192.168.178.21:/share/Public/Pikamera/bild_n.jpg')
camera.close()

Dann bekomme ich diese Fehlermeldung

Traceback (most recent call last):
File "Versuch1.py", line 7, in <module>
camera.capture('pi@192.168.178.21/share/Public/Pikamera/bild_1.jpgBild_1.jpg')
File "/usr/lib/python2.7/dist-packages/picamera/camera.py", line 1104, in capture
encoder.start(output)
File "/usr/lib/python2.7/dist-packages/picamera/encoders.py", line 772, in start
super(PiCookedOneImageEncoder, self).start(output)
File "/usr/lib/python2.7/dist-packages/picamera/encoders.py", line 316, in start
self._open_output(output)
File "/usr/lib/python2.7/dist-packages/picamera/encoders.py", line 291, in _open_output
self.output = io.open(output, 'wb', buffering=65536)
IOError: [Errno 2] No such file or directory: 'pi@192.168.178.21/share/Public/Pikamera/bild_1.jpgBild_1.jpg'

Deswegen wollte ich das die Py zuerst Lokal abspeichert und dann mit einem anderen Script die datei per scp (oder so ) auf das LAN(NAS) Laufwerk verschiebt.

So in etwa.

import SCPClient
import scp

client = scp.Client(host=192.168.178.21, user=user, password=password)
client.transfer('~/bild_1.jpg', '/share/Public/Pikamera/bild_1.jpg')

Leider funktioniert das nicht ganz. Habe etwas warscheinlich vergessen!

Mit freundlichen Grüßen
r12w04
BlackJack

@r12w04: Wohin hast Du die SMB-Freigabe denn gemountet? Dorthin musst Du auch speichern. Das ist dann ja ein ganz normales Verzeichnis aus sicht des Skriptes mit einem ganz normalen Namen, also ohne irgendwelche Nutzernamen und IP-Adressen. Das könnte dann so aussehen:

Code: Alles auswählen

import time
import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (2592, 1944)
    time.sleep(0.01)
    camera.capture('/mnt/wasauchimmer/Pikamera/bild_n.jpg')
Und das ist wie gesagt keine Python-Frage sondern wie Du in Deinem Linux-Netzwerk die Freigaben konfiguriert hast. Also wo Du lokal die SMB-Freigabe gemountet hast.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@r12w04
Das Verzeichnis auf Deinem pi muss natürlich gemountet sein, um darauf gewöhnlich zugreifen zu können. Ich nutze z. B. ``autofs``, um mein NAS ansprechen zu können.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
r12w04
User
Beiträge: 6
Registriert: Freitag 30. Mai 2014, 11:20

dazu habe ich eine Frage.
Warum klapt es wenn ich diesen Befehl im Terminal eingebe " scp ~/bild_n.jpg pi@192.168.178.21:/share/Public/Pikamera/bild_n.jpg " wird ein PW abgefragt, den ich eintippe und schon wird das Bild kopiert.

Wenn ich das Manuel kann ohne zu Mounten wie Ihr das sagt. dann müste es doch auch die selbe reiehnfolge auch mit einem Script gehen oder nicht??

Verstehe ich da was Falsch?

Ich habe sozusagen 3 rechner.
Ein Rechner ist eine große Festplatte

Die anderen zwei /drei ... (n) Rechner sollen nur eine Datei ( in meinem Fall nur ein Bild) auf die Platte kopieren.

So jetzt binn ich wieder bei Python.
Damit habe ich geschaft das mir die kamera mit hilfe eines tasters ein bild macht.
so in etwa .:
import time
import picamera
import RPi.GPIO as GPIO # new

GPIO.setmode(GPIO.BCM) # new
GPIO.setup(17, GPIO.IN, GPIO.PUD_UP) # new

with picamera.PiCamera() as camera:
camera.start_preview()
GPIO.wait_for_edge(17, GPIO.FALLING) # new
camera.capture('/home/pi/Desktop/image.jpg')
camera.stop_preview()

jetzt muss es nur noch auf die Festplatte übertragen werden. (scp ~/bild_n.jpg pi@192.168.178.21:/share/Public/Pikamera/bild_n.jpg)

Mehr möchte ich ja nicht.
Bitte sagts mir was ich falsch mache!!!

Danke.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@r12w04
Du könntest `scp` über das `subprocess` Modul ansprechen. Aber weshalb verwendest Du dann überhaupt Python? Dann spar' Dir den Umweg und mach' doch ein Bashskript.
Ich an Deiner Stelle würde mich mit dem Thema 'mounten' etwas näher befassen. Du willst doch nicht ständig über eine ssh-Verbindung auf Deinen Raspberry zugreifen, oder?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@r12w04: Genau das selbe geht per Skript nicht weil ``scp`` das Passwort abfragt und dazu möchte es eine direkte Verbindung zu einem Terminal haben und keine zu einem Programm, damit sicher, oder zumindest sicherer ist, dass das Passwort von einem Menschen eingegeben wird und nicht von einem Programm. Das kann man natürlich austricksen in dem man ``scp`` vorspiegelt es wäre direkt mit einem Terminal verbunden und würde die Eingaben von dort bekommen, aber das wäre ziemlich unsinnig so einen Aufwand zu betreiben um ein Sicherheitsfeature auszuhebeln. Wenn man ``scp`` verwenden will, sollte man eher den öffentlichen Schlüssel der Gegenseite bekanntmachen und sich darüber authentifizieren anstatt ein Passwort zu verwenden.

Letztlich verstehe ich aber nicht so ganz wozu man sich ein NAS ins Netzwerk integriert, da Freigaben drauf hat, und die dann nicht nutzt. Das ist doch der Sinn von einem NAS, dass man das *einfach* nutzen kann, aus jedem Programm heraus, als wenn's lokaler Speicher wäre. Dann braucht man sich nicht irgendwelche Spezialfälle ins eigene Programm einbauen, sondern kann die Daten einfach ganz normal speichern und die Übertragung dem Betriebssystem/Dateisystem überlassen.
r12w04
User
Beiträge: 6
Registriert: Freitag 30. Mai 2014, 11:20

Danke für die ausfürliche Antwort.

Ich habe jetzt die Festplatte gemountet.
mit dem Befehl im Terminal df -h sehe ich die Platte.

Jetzt habe ich zum Testen im Script folgendes reingeschriebn.

import time
import RPi.GPIO as GPIO
import picamera

with picamera.PiCamera() as camera:
camera.resolution = (2592, 1944)
time.sleep(0.01)
camera.capture('/mnt/smb/Pikamera/Bild_1.jpg')
camera.close()

bekomme ich folgende Meldung.

Traceback (most recent call last):
File "KameraohneGPIO.py", line 8, in <module>
camera.capture('/mnt/smb/Pikamera/Bild_1.jpg')
File "/usr/lib/python2.7/dist-packages/picamera/camera.py", line 1104, in capture
encoder.start(output)
File "/usr/lib/python2.7/dist-packages/picamera/encoders.py", line 772, in start
super(PiCookedOneImageEncoder, self).start(output)
File "/usr/lib/python2.7/dist-packages/picamera/encoders.py", line 316, in start
self._open_output(output)
File "/usr/lib/python2.7/dist-packages/picamera/encoders.py", line 291, in _open_output
self.output = io.open(output, 'wb', buffering=65536)
IOError: [Errno 13] Permission denied: '/mnt/smb/Pikamera/Bild_1.jpg'

Das Bild wird zwar in dem Verzeichniss erstellt aber wenn ich das Bild kann nicht geöffnet werden.

Folgende Meldung erschein. " Das Bild kann nicht angezeigt werden, da die Datei leer ist.

Wenn ich das Bild Lokal auf dem Pi erstellen lasse und dann hendisch mit dem Befehl " mv Bild_1.jpeg /mnt/smb/Pikamera/ " reinschreibe wird das Bild mir verschoben und ich kann es ganz normal öffnen.

Auf dem Laufwerk kann ich ordner erstellen und wieder löschen. Also an den Rechten liegt das wohl nicht.

Wie kann man das schreiben damit nach der Erstellung des Bildes die datei ins Zielverzeichnis kopiert wird?

Danke für die Hilfe!!!
BlackJack

@r12w04: Der Fehler 'Permission denied' sollte schon was mit Rechten zu tun haben.
Antworten