2014-12-14 14 views
5

na moim Raspberry Pi, spotykam się z dziwnym zachowaniem dotyczącym użycia modułu PiCamera.PiCamera nie może zostać zainicjowany jako członek klasy, gdy skrypt uruchamiany jest z wiersza polecenia

Poniższy kod działa sprawnie, gdy obaj zaczęli od biegu jałowego (F5) lub z poziomu wiersza poleceń ($ python test.py)

import picamera 

if __name__ == "__main__": 
    camera=picamera.PiCamera() 
    camera.close() 

Ale kiedy umieścić obiekt kamery w klasie kod będzie działał tylko wtedy, gdy zaczęło się od IDLE (F5):

import picamera 

class VF: 
    def __init__(self): 
     self.camera = picamera.PiCamera() 

    def __del__(self): 
     self.camera.close() 


if __name__ == "__main__": 
    myvf = VF() 

kiedy zacznę powyższy kod z wiersza polecenia, pojawia się następujący komunikat o błędzie:

mmal: mmal_vc_component_enable: failed to enable component: ENOSPC

Traceback (most recent call last): File "test.py", line 14, in myvf = VF()

File "test.py", line 6, in init self.camera = picamera.PiCamera()

File "/usr/lib/python2.7/dist-packages/picamera/camera.py", line 379, in init camera_num, self.STEREO_MODES[stereo_mode], stereo_decimate)

File "/usr/lib/python2.7/dist-packages/picamera/camera.py", line 505, in _init_camera prefix="Camera component couldn't be enabled")

File "/usr/lib/python2.7/dist-packages/picamera/exc.py", line 133, in mmal_check raise PiCameraMMALError(status, prefix)

picamera.exc.PiCameraMMALError: Camera component couldn't be enabled: Out of resources (other than memory)

Moduł kamery działa poprawnie, po prostu usunąłem kod do najmniejszego możliwego rozmiaru. Czy ktokolwiek zna ten problem lub podobny problem i prawdopodobnie może dostarczyć rozwiązanie? Wersja Pythona to 2.7, a system Raspberry Rasbiab jest całkowicie aktualny. Z góry dzięki.

+1

Właśnie potwierdziłem to zachowanie na innym Raspberry-Pi z innym modułem kamery. – Pepschmier

Odpowiedz

2

Wykryto, że moduł kamery nie jest poprawnie wyłączany, gdy destruktor nie jest jawnie wywoływany (przy wyłączonej diodzie LED, więc tego nie widziałem).

IDLE obsługuje uruchomioną kamerę, w jakiś sposób resetując ją przed uruchomieniem skryptu, ale nie interpreter python.

Wszystko jest więc w porządku, gdy destruktor zostanie wywołany przed zakończeniem skryptu.

+0

Przez "destruktor" rozumiesz metodę camera.close(), tak? – wil

3

Walczyłem z tym przez wiele godzin i ciągle otrzymywałem błąd "z zasobów". I w końcu zorientowali się, że w mojej funkcji take-the-picture, musiałem się upewnić, zrobiłem to tak:

 
    camera = PiCamera() 
    (...camera settings here...) 
    camera.capture(myfileName) 
    camera.close() 

Gdybym nie zrobić Close(), to bym się tego błędu każdy czas. Upewnij się więc, że camera.close() jest wywoływana zaraz po "przyciągnięciu". Rozwiązał problem dla mnie.

Powiązane problemy