hallo,
ich habe folgendes Problem: ich habe eine Fotobox gebaut und über Python programmiert und soweit funktioniert auch alles. Nur einigen gemachte Fotos hängt sich das Programm auf und ich bekomme eine Fehlermeldung "zu wenig Arbeitsspeicher verfügbar". Ich habe dann mit free und top kontrolliert, und ja nach jedem gemachten Foto wird der Ram weniger.
nach langem Suchen frage ich mal hier nach: wie kann man das beheben? gibt es eine Möglichkeit den RAM automatisch zu leeren, wenn zu niedrig wird? kann ich das irgendwie im Python Skript einbauen?
ich bin noch relativ neu in diesem Gebiet..
Danke im Vorraus!
hier mein Code
#!/usr/lib/python3.7
from time import sleep
from datetime import datetime
from sh import gphoto2 as gp
import signal, os, subprocess
import shutil
import glob
import random
#from pynput.keyboard import Key, Controller
from time import sleep
# gphoto Prozess killen, wenn die Kamera verbunden wird
# der kill Befehl um Bilder zu machen (Nummer ändert sich jedesmal)
def killgphoto2Prozess():
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
out, err = p.communicate()
# die Zeile suchen, die den Prozess hat (der gekillt werden soll)
for line in out.splitlines():
if b'gvfsd-gphoto2' in line:
# den Prozess killen
pid = int(line.split(None,1)[0])
os.kill(pid, signal.SIGKILL)
speicherort = "/home/pi/Desktop/fotobox_test/zwischen" # TODO externe Disk
programmOrt = "/home/pi/Desktop/fotobox_test"
def clearCameraSD():
clearCommand = ["--folder", "/store_00020001/DCIM/100CANON", "-R", "--delete-all-files"]
gp(clearCommand)
def createSaveFolder():
#clearCameraSD()
if not(os.path.exists(speicherort) and os.path.isdir(speicherort)):
os.makedirs(speicherort)
def bildmachen():
triggerCommand = ["--trigger-capture"]
gp(triggerCommand)
sleep(1)
#os.chdir(TEMPDIR)
downloadCommand = ["--get-all-files"]
gp(downloadCommand)
#clearCameraSD()
for filename in os.listdir("."):
#if filename.endswith(".JPG"):
return speicherort+"/"+filename
#keyboard = Controller()
def foto():
global speicherort
killgphoto2Prozess()
clearCameraSD()
createSaveFolder()
os.chdir(speicherort)
photo = bildmachen()
#print(photo)
# TODO: zu speicherort verschieben und neuen pfad zurück geben
#_bn = os.path.basename(photo)
newPath = photo
#os.rename(photo, newPath)
#os.chdir(programmOrt)
return newPath
def fotoMove():
new_dir = "/home/pi/Desktop/fotobox_test/fotos"
files = glob.iglob(os.path.join(speicherort, "*.JPG"))
for file in files:
if os.path.isfile(file):
shutil.move(file, new_dir)
#print("foto vecshoen")
if __name__ == "__main__":
print(foto())
Display More
PS: mit diesem Code mache ich ein Foto und speichere es mir von der Kamera auf den Raspberry runter. Ich habe noch ein anderes Skript wo ich quasi nur kontrolliere ob ein Button gedrückt ist, um ein Foto zu machen.