Python线程terminal

你好,stackoverflow的思想,

我遇到了一个令人困惑的错误。 我有一个python脚本,创build一个新的线程,ssh到远程机器,并启动一个进程。 但是,这个过程不会自行返回(并且我希望它在整个脚本期间保持运行)。 为了强制线程返回,在我的脚本结束时,我再次进入机器并杀死进程。 这是行之有效的,期望它打破terminal的事实。

要启动线程我运行下面的代码:

t = threading.Thread(target=run_vUE_rfal, args=(vAP.IP, vUE.IP)) t.start() 

函数run_vUE_rfal如下所示:

 cmd = "sudo ssh -ti ~/.ssh/my_key.pem user@%s 'sudo /opt/company_name/rfal/bin/vUE-rfal -l 3 -m -d %s -i %s'" % (vUE_IP, vAP_IP, vUE_IP) output = commands.getstatusoutput(cmd) return 

看起来,当命令运行,它以某种方式打破我的terminal。 它被打破了,而不是为每个打印创build一个新行,它将我的terminal的WIDTH附加到每行的末尾的空白,并打印它看起来像一个长的string。 此外,我无法看到我的键盘input到该terminal,但它仍然成功读取。 我的terminal看起来像这样:

 normal formatted output normal formatted output running vUE-rfal print1 print2 print3_extra_long print4 

如果我用一些简单的打印replacerun_vUE_rfal函数的主体,terminal不会中断。 我在这个脚本中有许多其他的SSH和Telnet工作正常。 然而,这是我在单独的线程中运行的唯一一个,因为它是唯一不返回的线程。 当我的脚本完成时,我需要保持closures远程机器进程的能力。

任何解释的原因和想法的修复非常赞赏。

提前致谢。

看来你控制的过程是改变终端设置。 这些绕过 stderr和stdout – 有很好的理由。 例如,即使输出被重定向,ssh本身也需要用户询问密码。

解决这个问题的方法可能是使用python-module pexpect (这是第三方库)来启动你的进程,因为它将会创建你自己不关心的伪造的tty。

顺便说一句,要“修复”您的终端,使用reset命令。 正如你已经注意到的,你可以输入命令。 reset会将终端设置为默认设置。