异常str()失败

时间:2019-02-04 15:06:38

标签: python string raspberry-pi libgphoto2

我开始用Raspberry Pi 3B +和佳能6D创建一个新的3D扫描仪。由于有了gphoto2库,我有一部分Python代码可以恢复图像,但是我无法将我的ISO配置放到反射板上。

我已经做过几次测试,但是没有任何效果。我总是有相同的错误:

我使用gp命令将所有参数发送到佳能反射。

导入:

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 个答案:

答案 0 :(得分:2)

来自sh documentation on passing in arguments

  

将多个参数传递给命令时,每个参数必须必须是单独的字符串[。]

您不是分开的字符串。拆分不同的部分(在不包含引号的空格上):

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

另请参见项目的detailed explanation on why this is;但是简短的答案是sh不会像shell一样将参数解析为单独的字符串。

您还可以使用shlex.split() function为您处理拆分:

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

请注意,sh也是supports using keyword arguments,其中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_1subclass of sh.ErrorReturnCode)上失败。从sh source code for the exception class中可以看到,错误消息已从字节解码为Unicode文本,而Python 2实际上无法处理从__str__方法返回的Unicode对象。我已经filed a bug report with sh将其修复。