2014-02-02 6 views
0

Я бегу питона на Linux, и когда я бегу мой сценарий с:команда терпит неудачу в питона, но не в терминале

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

я получаю это:

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

Когда я запускаю это команды с терминала с моим пользователем по умолчанию, не появляется вывод/ошибка.

Почему это происходит при запуске скрипта, но не в терминале?

Редактировать: Исправлен вывод кода и ошибок.

+0

Работает ли он в REPL? –

+0

Можете ли вы показать нам больше контекста? Мы не можем видеть, как вы выгружаете данные из программы, и это приводит к сбою с ошибкой ввода-вывода, что может быть связано с тем, как вы читаете его вывод. (Если вы закрываете трубку и, например, пытаетесь записать ее). Также, как вы запускаете это в терминале? – Thanatos

+0

Извините, на самом деле это означало os.system ('v4l2-ctl -c exposure_auto = 1'). Исправлено в оригинале. В терминале я запускаю: v4l2-ctl -c exposure_auto = 1, и он работает (изменения параметров). – user3188653

ответ

0

Когда такая программа умирает с таинственной ошибкой, это означает, что что-то о ее среде при запуске под Python тонко отличается, что имеет значение для специальных вызовов ввода-вывода, которые он создает. Вопрос в том, что может быть иначе? Я просто, как тест, провел основную команду cat из оболочки - позволяя ей сидеть там, чтобы я мог проверить ее состояние, прежде чем нажать 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 на них, или открыв их в less пейджера и используя / и ? для поиска вперед и назад (и n и N продолжать искать, как только вы ввели поиск фраза с / или ?), может помочь вам быстро прыгнуть.

Посмотрите на нижнюю часть trace-bad.log на системный вызов, который на самом деле дает ошибку. Затем зайдите в trace-good.log за тот же звонок, когда он преуспеет, и разместите здесь разницу.

+0

Выход такой же. – user3188653

+0

Я действительно решил проблему, и я немного смущен. Причина заключалась в том, что я выполнил доступ к функциям камеры перед запуском данной команды. Я просто переключил порядок, и все. Спасибо всем и спасибо Brandon за инструкции по отладке, я уверен, что они придут в будущем! – user3188653

Смежные вопросы