命令在python中失败,但在终端中失败

时间:2014-02-02 02:13:34

标签: python v4l2

我正在linux上运行python,当我运行我的脚本时:

os.system('v4l2-ctl -c exposure_auto=1')

我明白了:

VIDIOC_S_EXT_CTRLS: failed: Input/output error
exposure_auto: Input/output error

当我使用默认用户从终端运行此命令时,不会出现输出/错误。

为什么在运行脚本时会失败,但在终端中却没有?

编辑:更正了代码和错误输出。

1 个答案:

答案 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寻呼机中打开日志并使用/?来回搜索(和nN在您输入带/?的搜索词组后继续搜索,可以帮助您快速跳转。

trace-bad.log的底部附近查看实际发生错误的系统调用。然后在成功时查看trace-good.log同一个电话,并在此处为我们发布差异。