Создание подпроцесса в python - PullRequest
0 голосов
/ 17 ноября 2011

Я пытаюсь использовать модуль subprocess вместе с классом Popen для создания и запуска процесса. До сих пор мне всегда удавалось вызывать любую программу, которую я хотел.

Теперь я пытаюсь вызвать paraview (версия 3.8.1) со скриптом python, прикрепленным к нему в качестве параметра, например так:

paraview --script=script.py

Если я запускаю эту команду из консоли, она работает просто отлично. Если я попытаюсь запустить его с моим классом Popen, произойдет сбой с сообщением об ошибке:

/home/woltan/local/lib/python2.7/site.py:157: Warning: 'with' will become a reserved keyword in Python 2.6
'import site' failed; use -v for traceback
/home/woltan/local/lib/python2.7/linecache.py:127: Warning: 'with' will become a reserved keyword in Python 2.6
/home/woltan/local/lib/python2.7/site.py:157: Warning: 'with' will become a reserved keyword in Python 2.6
'import site' failed; use -v for traceback
ERROR: In /home/kitware/Kitware/ParaView-3.8.1/source/Utilities/VTKPythonWrapping/Executable/vtkPVPythonInteractiveInterpretor.cxx, line 75
vtkPVPythonInteractiveInterpretor (0x124e9d0): Failed to locate the InteractiveConsole object.

Сам Paraview запускается. Но является ли сообщение об ошибке тем, что у самого paraview есть интерпретатор python, который он использует? Или я могу настроить свою Popen процедуру вызова, которая выглядит следующим образом:

p = subprocess.Popen("paraview --script=script.py", bufsize = -1, shell = True)

Как может быть, что процесс может быть создан из консоли, но не с помощью Popen -вызова сверху?

Редактировать

Я скачал и установил версию paraview, в которой работает python 2.7 (а не python 2.5 версии, которую я использовал выше), и вызов Popen работает. Так что это должно быть как-то связано с Python-версией paraview. Единственный оставшийся вопрос: почему это вообще имеет значение, когда я запускаю процесс с Popen?

Ответы [ 2 ]

3 голосов
/ 17 ноября 2011

Есть две вещи, которые являются strage:

  1. Обычно этот вызов не должен работать вообще.Поскольку у вас есть shell=False, вам необходимо использовать последовательность в качестве 1-го параметра:

    p = subprocess.Popen(("paraview", "--script=script.py"), bufsize=-1)
    

    (shell=False по умолчанию.)

  2. Вы, кажется,чтобы смешать несколько версий Python:

    /home/woltan/local/lib/python2.7/site.py:157: Warning: 'with' will become a reserved keyword in Python 2.6
    

В упомянутом site.py используется ключевое слово with.Это нормально, потому что он предназначен для Python 2.7.Версия Python, которую вы используете, похоже, пришла из Python 2.5.В версии 2.4 не было with, а в 2.6 она уже присутствовала.

1 голос
/ 17 ноября 2011

Полученное сообщение об ошибке не похоже на subprocess.Popen. Я бы сказал, что вам нужно либо shell=True:

p = subprocess.Popen("paraview --script=script.py", shell = True)

или отдельный args в последовательности:

p = subprocess.Popen(['paraview', '--script=script.py'])

Я никогда не использовал bufsize, но я не думаю, что здесь какая-то разница.

...