Когда такая программа умирает с таинственной ошибкой, это означает, что что-то о ее среде при запуске под 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
за тот же звонок, когда он преуспеет, и разместите здесь разницу.
Работает ли он в REPL? –
Можете ли вы показать нам больше контекста? Мы не можем видеть, как вы выгружаете данные из программы, и это приводит к сбою с ошибкой ввода-вывода, что может быть связано с тем, как вы читаете его вывод. (Если вы закрываете трубку и, например, пытаетесь записать ее). Также, как вы запускаете это в терминале? – Thanatos
Извините, на самом деле это означало os.system ('v4l2-ctl -c exposure_auto = 1'). Исправлено в оригинале. В терминале я запускаю: v4l2-ctl -c exposure_auto = 1, и он работает (изменения параметров). – user3188653