#!/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 进程在端口 12345 上监听 jmx 客户端。 脚本“works”: x 是正确的(当您打印它或在 pdb 中查看它时)。
那么问题是什么?当这个脚本终止时,shell 的行为很奇怪。在 Linux 和 OS-X 上,在 shell 中键入内容是不可见的(尽管输出可见),而在 Windows 上,每个命令键入的前两个字符将被忽略。执行终端“重置”命令似乎可以修复它,但我不想让我的脚本的用户遭受这种情况。
删除脚本的最后一行(访问 p.stderr.readline())可以消除问题,也可以消除脚本的实用程序。
我删除了身份验证以简化示例。您会注意到,我没有打印 x,以避免向 shell 写入一些令人讨厌的内容作为罪魁祸首。
版本:Snow Leopard 和各种 Linux 上的 CPython 2.7; Windows 7 上的 CPython 2.6.3
最佳答案
jmxterm 可能正在为终端上的交互式使用进行一些初始化,或者是因为错误,或者是因为您没有明确关闭它,所以它不会自行清理。避免这种情况的最简单方法可能是将其 STDOUT 也连接到 PIPE,就像对其他标准流所做的那样。
关于java - jmx-term python 子进程毒害 shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3817544/