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

命令在python中失败,但在终端中失败,python,v4l2,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 当我使用默认用户从终端运行此命令时,不会出现输出/错误 为什么在运行脚本时失败,而不是在终端中 编辑:更正了代码和错误输出。当这样一个程序由于一个神秘的错误而死亡时,这意味着在

我在linux上运行python,当我使用以下命令运行脚本时:

os.system('v4l2-ctl -c exposure_auto=1')
我明白了:

VIDIOC_S_EXT_CTRLS: failed: Input/output error
exposure_auto: Input/output error
当我使用默认用户从终端运行此命令时,不会出现输出/错误

为什么在运行脚本时失败,而不是在终端中


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

当这样一个程序由于一个神秘的错误而死亡时,这意味着在Python下运行时,它的环境有些微妙的不同,这与它正在进行的特殊IO调用有关。问题是:可能有什么不同?作为一个测试,我只是从一个shell运行了基本的
cat
命令——让它坐在那里,这样我就可以在再次按下Control-D退出它之前检查它的状态——然后从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
在输入搜索短语后继续搜索
//code>或
),可以帮助你快速地跳跃


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

它在REPL中有效吗?能否向我们展示更多上下文?我们看不到您是如何将数据从程序中导出的,并且它由于I/O错误而失败,这可能是由于您读取其输出的方式造成的。(例如,如果您关闭管道并尝试写入。)另外,您如何在终端中运行此操作?对不起,实际上是指os.system('v4l2-ctl-c exposure_auto=1')。更正为原文。在终端中,我运行:v4l2 ctl-c exposure_auto=1,它可以正常工作(参数更改)。@user3188653:这是一个很大的区别。很抱歉,还添加了第二行错误代码。我确实解决了问题,我有点尴尬。原因是,我的脚本在运行给定命令之前确实访问了摄影机功能。我只是简单地改变了顺序,就这样。谢谢大家,谢谢布兰登的调试指导,我相信他们会在未来携手共进!