我正在linux上运行python,当我运行我的脚本时:
os.system('v4l2-ctl -c exposure_auto=1')
我明白了:
VIDIOC_S_EXT_CTRLS: failed: Input/output error
exposure_auto: Input/output error
当我使用默认用户从终端运行此命令时,不会出现输出/错误。
为什么在运行脚本时会失败,但在终端中却没有?
编辑:更正了代码和错误输出。
答案 0 :(得分:0)
当像这样的程序死于一个神秘的错误时,这意味着在Python下运行时它的环境有些微妙的不同,其方式与它正在进行的特殊IO调用有关。问题是:可能会有什么不同?我只是作为一个测试,从shell运行基本的cat
命令 - 让它坐在那里,以便我可以检查它的状态,然后再按Control-D再次退出它 - 然后从{{1 Python中的函数。在这两种情况下,os.system()
表明它具有完全相同的文件打开和终端连接:
lsof
在你的情况下,命令可能会运行并且退出得太快,以至于你很难在$ lsof -p 7573
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cat 7573 brandon cwd DIR 0,24 45056 131082 /home/brandon
cat 7573 brandon rtd DIR 8,2 4096 2 /
cat 7573 brandon txt REG 8,2 46884 661873 /bin/cat
cat 7573 brandon mem REG 8,2 2919792 393288 /usr/lib/locale/locale-archive
cat 7573 brandon mem REG 8,2 1779492 270509 /lib/i386-linux-gnu/libc-2.17.so
cat 7573 brandon mem REG 8,2 134376 270502 /lib/i386-linux-gnu/ld-2.17.so
cat 7573 brandon 0u CHR 136,19 0t0 22 /dev/pts/19
cat 7573 brandon 1u CHR 136,19 0t0 22 /dev/pts/19
cat 7573 brandon 2u CHR 136,19 0t0 22 /dev/pts/19
的中途捕获它以查看它的外观。实际上,您需要做的是在lsof
下以两种方式运行它,并确定哪个系统调用失败,以及原因。
strace
日志很长,但在strace -o trace-good.log v4l2-ctl -c exposure_auto=1
trace-bad.log python my-script.py # that has strace -o in its system() call!
上使用grep
,或在less
寻呼机中打开日志并使用/
和?
来回搜索(和n
和N
在您输入带/
或?
的搜索词组后继续搜索,可以帮助您快速跳转。
在trace-bad.log
的底部附近查看实际发生错误的系统调用。然后在成功时查看trace-good.log
同一个电话,并在此处为我们发布差异。