Ошибка исключения str()

Я начинаю создавать новый 3D-сканер с Raspberry Pi 3B + и Canon 6D. У меня есть часть кода Python для восстановления изображений благодаря библиотеке gphoto2, но я не могу перевести свою конфигурацию ISO в рефлекс.

Я уже сделал несколько тестов, но ничего не работает. У меня всегда одна и та же ошибка:

Я использую команду gp для отправки всех параметров в рефлекс Canon.

Импортировать:

import time
from datetime import datetime
from sh import gphoto2 as gp
import signal, os, subprocess, shutil

Пример команды Gp (все работает):

CaptureImageDownload = ["--capture-image-and-download"]
CaptureImage = ["--capture-image"]

Но эта строка не работает:

ValueISO = ["--set-config iso=0"]

Вот ошибка, отображаемая в командном терминале

File "CameraShot.py", line 124, in <module>
gp(ValueISO)
File "/usr/local/lib/python2.7/dist-packages/sh.py", line 1427, in __call__
return RunningCommand(cmd, call_args, stdin, stdout, stderr)
File "/usr/local/lib/python2.7/dist-packages/sh.py", line 774, in __init__
self.wait()
File "/usr/local/lib/python2.7/dist-packages/sh.py", line 792, in wait
self.handle_command_exit_code(exit_code)
File "/usr/local/lib/python2.7/dist-packages/sh.py", line 815, in handle_command_exit_code
raise exc
sh.ErrorReturnCode_1: <exception str() failed>

Я не могу написать эту командную строку, иначе моя камера не понимает порядок.

1 ответ

Решение

От sh документация по передаче аргументов:

При передаче нескольких аргументов команде каждый аргумент должен быть отдельной строкой [.]

Ваши не отдельные строки. Выделите различные части (в местах, не заключенных в кавычки):

ValueISO = ["--set-config", "iso=0"]

Также см. Подробное объяснение проекта, почему это так; но короткий ответ таков sh не разбирает аргументы в отдельные строки, как это делает оболочка.

Вы также можете использовать shlex.split() Функция для управления расщеплением для вас:

ValueISO = shlex.split("--set-config iso=0")

Обратите внимание, что sh также поддерживает использование аргументов ключевых слов, где set_config="iso=0" переводится на ["--set-config", "iso=0"] для тебя. Вы можете использовать это как:

value_iso = dict(set_config="iso=0")

затем

gp(**value_iso)

Что вы получаете sh.ErrorReturnCode_1: <exception str() failed> вероятно ошибка в sh, Python использует type(exception).__name__: str(exception) как последняя строка трассировки, и str() вызов не удается на sh.ErrorReturnCode исключение (sh.ErrorReturnCode_1 это подкласс sh.ErrorReturnCode). Я могу видеть из sh Исходный код для класса исключения, в котором сообщение об ошибке декодируется из байтов в текст Unicode, а Python 2 фактически не может обрабатывать объекты Unicode, возвращаемые из __str__ метод. Я подал отчет об ошибке с sh чтобы это исправить.

Другие вопросы по тегам