2014-12-14 16 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.