Как сохранить xfoil открытым с помощью подпроцесса - PullRequest
0 голосов
/ 06 мая 2019

Резюме

Я автоматизирую xfoil с помощью модуля subprocess.Я хотел бы иметь возможность начать сеанс xfoil с несколькими командами и оставить его открытым для пользователя.Это поможет отладке, а также, в более общем смысле, будет иметь базовую подпрограмму для запуска xfoil (без необходимости каждый раз вводить один и тот же набор команд).

Я могу выполнить любую команду xfoil, используя subprocess.communicate().Однако при открытии с помощью subprocess xfoil систематически закрывается без действий пользователя.

Пример

С помощью следующего кода вы можете увидеть, как быстро открываются и закрываются xfoil.

import subprocess

XFOIL_PATH = 'xfoil.exe'

xfoil = subprocess.Popen(XFOIL_PATH, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         universal_newlines=True)

actions = 'NACA 0012\nGDES\n'
xfoil.communicate(input=actions)

Примечание

Я использовал subprocess.Popen() с Rhino, и Rhino остается открытым, пока я не закрою его вручную.Я не понимаю, почему поведение xfoil отличается.

Я подозреваю, что это как-то связано со стандартным выводом конкретного приложения, но это дикое предположение.Надеюсь, что с этим можно что-то сделать.

1 Ответ

1 голос
/ 06 мая 2019

Насколько я понимаю, когда вы вызываете communicate() с параметром input, вызов закрывается stdin, что завершает процесс xfoil.exe . Попробуйте вместо звонка communicate():

xfoil.stdin.write(actions)
xfoil.stdin.flush()

После этого процесс продолжается до тех пор, пока вы не закроете свой скрипт.

Обновление

Если вы хотите, чтобы проект xfoil продолжался даже после окончания работы вашего скрипта, изучите pexpect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...