Сбой os.system () в python - PullRequest
       7

Сбой os.system () в python

0 голосов
/ 09 февраля 2012

Я пытаюсь проанализировать некоторые данные и сделать графики с помощью Python, и возникает странная проблема. Звонок на os.system(), кажется, где-то теряется.

Следующие три строки:

os.system('echo foo bar')
os.system('gnuplot test.gnuplot')
os.system('gnuplot --version')

Следует напечатать:

foo bar
Warning: empty x range [2012:2012], adjusting to [1991.88:2032.12]
gnuplot 4.4 patchlevel 2

Но единственная значимая команда в середине, кажется, сброшена. Сценарий по-прежнему выполняет проверку эха и версии, и сам по себе запуск gnuplot (оболочка gnuplot) также работает, но предупреждения и вывод файла из gnuplot отсутствуют.

Почему эта команда отброшена и почему совершенно бесшумно?

В случае, если это полезно, вызов должен запустить gnuplot, он должен открыть пару файлов (указанные там инструкции и файл данных) и записать в файл SVG. Я попытался удалить целевой файл, чтобы его не пришлось перезаписывать, но безрезультатно.

Это python 3.2 на виртуальной машине Ubuntu Natty x86_64 с виртуальным ядром 2.6.38-8.

Ответы [ 3 ]

2 голосов
/ 11 февраля 2012

Итак, оказалось, что проблема была в том, что я не упомянул.Ранее в сценарии были написаны test.gnuplot и test.data, но я не обратил внимания на то, чтобы вызвать файловые объекты «close()» и убедиться, что они закрыты (до сих пор не знаю, как сделать эту последнюю часть, так что пока она циклически повторяетсянемного).Таким образом, произошло некоторое неожиданное поведение, заставляющее gnuplot видеть два нечитаемых файла, не предпринимать никаких действий, не выводить никаких данных и возвращать 0.

Я полагаю, что за это никто не получит баллы.

Изменить: я наконец понял с помощью strace.Не знаю, как я это делал, прежде чем я научился им пользоваться .

1 голос
/ 09 февраля 2012

не используйте os.system.Используйте subprocess модуль .

os.system документация говорит:

Модуль подпроцесса предоставляет более мощные средства дляпорождение новых процессов и извлечение их результатов;использование этого модуля предпочтительнее, чем использование этой функции.

Попробуйте это:

subprocess.check_call(['gnuplot', 'test.gnuplot'])
1 голос
/ 09 февраля 2012

Напечатано ли предупреждение в stderr, и оно как-то перехвачено?

Попробуйте вместо этого использовать подпроцесс, например, используя

subprocess.check_output(cmd, stderr=subprocess.STDOUT) 

и проверьте вывод.

(или вызов subprocess.call может работать лучше, чем os.system)

...