代码之家  ›  专栏  ›  技术社区  ›  phlip

JMX术语python子进程毒物外壳

  •  1
  • phlip  · 技术社区  · 14 年前
    #!/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上,每个命令键入的前两个字符将被忽略。执行终端“reset”命令似乎可以修复它,但我不想把它强加给脚本的用户。

    删除脚本的最后一行(访问p.stderr.readline())可以消除此问题,但也可以消除脚本的实用程序。

    我删除了身份验证以简化示例。你会注意到,我不打印X,以消除写一些讨厌的东西外壳作为罪魁祸首。

    版本:cpython 2.7在雪豹和各种Linux上;cpython 2.6.3在Windows 7上

    2 回复  |  直到 12 年前
        1
  •  2
  •   Rodrigo    13 年前

    jmxterm可能正在为终端上的交互使用做一些初始化,或者是因为一个bug,或者是因为您没有显式地关闭它,所以不会在它自身之后进行清理。避免这种情况的最简单方法可能也是将其stdout连接到管道,就像对其他标准流那样。

        2
  •  0
  •   Philip Reynolds    12 年前

    jmxterm正在处理您的终端。要做的最简单的事情是允许jmxterm干净地退出,从而清理自己。

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