gphoto2 как справиться с предупреждением вне фокуса - PullRequest
2 голосов
/ 18 февраля 2020

Вот как я делаю снимок с помощью камеры

import logging
import gphoto2 as gp
def main():
    def callback(level, domain, string, data=None):
        print('Callback: level =', level, ', domain =', domain, ', string =', string)
        if data:
            print('Callback data:', data)

    logging.basicConfig(
        format='%(levelname)s: %(name)s: %(message)s', level=logging.WARNING)
    callback_obj = gp.check_result(gp.use_python_logging())

    camera = gp.Camera()
    camera.init()
    try:
        camera_file_path = gp.check_result(camera.capture(gp.GP_CAPTURE_IMAGE))
    except gp.GPhoto2Error as ex:
        print("callback: ", ex, ex.code, ex.message, ex.string)
    camera.exit()

if __name__ == "__main__" : exit(main())

Если камера не может сфокусироваться, она выдает следующую ошибку

...
WARNING: gphoto2: (ptp_usb_getresp [usb.c:466]) PTP_OC 0x90c8 receiving resp failed: Out of Focus (0xa002)
WARNING: gphoto2: (camera_nikon_capture [library.c:3153]) 'ret' failed: 'Out of Focus' (0xa002)
WARNING: gphoto2: (gp_context_error) Out of Focus
WARNING: gphoto2: (gp_camera_capture [gphoto2-camera.c:1340]) 'camera->functions->capture (camera, type, path, context)' failed: -1
('callback: ', GPhoto2Error('[-1] Unspecified error',), -1, '[-1] Unspecified error', 'Unspecified error')

Код ошибки исключения -1 но как я могу получить Out of Focus предупреждение?

ОБНОВЛЕНИЕ

Отфильтрованы ненужные ошибки из журналов

import logging
import gphoto2 as gp
from datetime import datetime
def main():
    def callback(level, domain, string, data=None):
        err_codes = ("(0x2005)", "(0x2019)")
        if not string.decode().endswith(err_codes):
            print("[{0}] {1}: {2}".format(datetime.utcnow(), domain.decode(), string.decode()))
        if data:
            print('Callback data:', data)

    callback_obj = gp.check_result(gp.gp_log_add_func(gp.GP_LOG_ERROR, callback))
    camera = gp.Camera()
    try:
        camera.init()
    except gp.GPhoto2Error as err:
        exit(err.code)

    try:
        camera_file_path = camera.capture(gp.GP_CAPTURE_IMAGE)
    except gp.GPhoto2Error as err:
        exit(err.code)
    camera.exit()

if __name__ == "__main__" : exit(main())

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Вы определили функцию обратного вызова, в которой вы можете проанализировать строку ошибки для обнаружения не в фокусе, но вы не установили свой обратный вызов, поэтому libgphoto2 не использует его. Используйте gp_log_add_func для установки обратного вызова.

Кроме того, вы передаете возвращаемое значение camera.capture gp.check_result. Это неверно, поскольку camera.capture уже проверяет результат и вызывает исключение в случае ошибки.

0 голосов
/ 19 февраля 2020

Если вы можете выяснить имя регистратора, вы можете добавить к нему свой собственный обработчик и выполнить собственную обработку журналов.

Вызов getLogger с именем библиотеки вашей камеры даст вам регистратор.

Вызов AddHandler для этого регистратора с помощью специального обработчика позволит вам выполнить собственную обработку журналов для журналов, поступающих от этого регистратора. больше информации

Надеюсь, это поможет

...