jmx-term подпроцесс python отравляет оболочку - PullRequest
1 голос
/ 29 сентября 2010
#!/usr/bin/env python

from subprocess import *

p = Popen(
  args=("java","-jar","jmxterm-1.0-alpha-4-uber.jar"), 
  bufsize=0, 
  stdin=PIPE,
  stderr=PIPE
  )

p.stdin.write("open localhost:12345\n")
x = p.stderr.readline()

Для этого требуется процесс java, прослушивающий клиент jmx на порту 12345. Сценарий «работает»: x верен (когда вы его печатаете или смотрите в pdb).

В чем проблема? Когда этот скрипт завершает работу, оболочка ведет себя странно.В Linux и OS-X ввод в оболочке не виден (хотя вывод выводится), а в Windows первые два символа, введенные для каждой команды, игнорируются.Выполнение команды «reset» терминала, похоже, исправляет это, но я не хочу навязывать это пользователям моего скрипта.

Удаление последней строки скрипта (доступ к p.stderr.readline ())устраняет проблему, но также и утилиту скрипта.

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

Версии: CPython 2.7 на Snow Leopard и различных Linux;CPython 2.6.3 для Windows 7

Ответы [ 2 ]

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

jmxterm, вероятно, выполняет некоторую инициализацию для интерактивного использования на терминале, и либо из-за ошибки, либо из-за того, что вы не закрываете ее явно, она не очищает себя.Самый простой способ избежать этого - подключить его STDOUT к ТРУБЕ, как это делается для других стандартных потоков.

0 голосов
/ 31 декабря 2012

jmxterm работает с вашим терминалом. Самое простое, что нужно сделать, это разрешить jmxterm корректно завершиться, тем самым очистившись.

p.stdin.write('quit\n')
p.wait()
...