0

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

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

我明白了:

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

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

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

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

4

1 回答 1

0

当像这样的程序因一个神秘的错误而死时,这意味着在 Python 下运行时,它的环境发生了微妙的不同,这对它正在进行的特殊 IO 调用很重要。问题是:可能有什么不同?作为测试,我只是cat从 shell 运行基本命令——让它坐在那里,以便我可以在按 Control-D 再次退出之前检查它的状态——然后从os.system()Python 中的函数运行它。在这两种情况下,都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中打开它们并使用and来回搜索(并在输入搜索短语后继续搜索or ),可以帮助您快速跳转。less/?nN/?

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

于 2014-02-02T02:19:36.883 回答