Python 抑制子进程的输出

Python 抑制子进程的输出,python,python-2.7,ssh,subprocess,Python,Python 2.7,Ssh,Subprocess,我想使用子流程模块来控制通过ssh生成的一些流程 通过搜索和测试,我发现这是可行的: import subprocess import os import time node = 'guest@localhost' my_cmd = ['sleep','1000'] devnull = open(os.devnull, 'wb') cmd = ['ssh', '-t', '-t', node] + my_cmd p = subprocess.Popen(cmd, stderr=devnull,

我想使用子流程模块来控制通过ssh生成的一些流程

通过搜索和测试,我发现这是可行的:

import subprocess
import os
import time

node = 'guest@localhost'
my_cmd = ['sleep','1000']
devnull = open(os.devnull, 'wb')
cmd = ['ssh', '-t', '-t', node] + my_cmd
p = subprocess.Popen(cmd, stderr=devnull, stdout=devnull)


while True:
    time.sleep(1)
    print 'Normal output'
我提供的-t-t选项允许我终止远程进程,而不仅仅是ssh命令。但这也扰乱了我的程序输出,因为换行符不再有效,使它成为一个长且难以读取的字符串

如何使ssh不影响python程序的格式

样本输出:

guest:~$ python2 test.py 
Normal output
             Normal output
                          Normal output
                                       Normal output
                                                    Normal output
                                                                 Normal output
                                                                              Normal output
(First ctrl-c)
Normal output
Normal output
Normal output
(Second ctrl-c)
^CTraceback (most recent call last):
  File "test.py", line 13, in <module>
    time.sleep(1)
KeyboardInterrupt
guest:~$python2 test.py
正常输出
正常输出
正常输出
正常输出
正常输出
正常输出
正常输出
(第一个ctrl-c)
正常输出
正常输出
正常输出
(第二个ctrl-c)
^CTraceback(最近一次通话最后一次):
文件“test.py”,第13行,在
时间。睡眠(1)
键盘中断

好,现在输出已清除。我不知道确切的原因,但是命令
ssh-t-t
将本地终端置于原始模式。无论如何,这是有意义的,因为它允许您在远程设备上直接使用curses程序(如vi),在这种情况下,不应进行任何转换,即使是简单的
\n
->
\r\n
允许简单的新行将光标保留在第一列上。但是我在ssh文档中找不到关于这个的参考

它(
-t-t
)允许您终止远程进程,因为原始模式允许将Ctrl+C发送到远程,而不是由本地tty驱动程序处理

IMHO,这是设计的味道,因为您只使用pty分配的一个副作用将Ctrl+C传递到远程,并且您会受到另一个副作用的影响,即本地系统上的原始模式。当您在本地键盘上输入特殊字符时,您应该处理标准输入(
stdinput=subprocess.PIPE
),并明确地发送一个
chr(3)
,或者为SIG-INT安装一个信号处理程序


或者,作为一种解决方法,在启动远程命令后,您可以简单地使用类似于操作系统(“stty opost-igncr”)(或者更好地使用其子流程等效项)的方法,以在可接受的模式下重置本地终端。

您能提供示例输出吗?不清楚你所说的“混乱”是什么意思。stackoverflow会把一切都标记好。换线后,输出将不会与终端的起始点对齐。但是,消息打印正确。此外,如果我按住ctrl-c键并返回到终端,按enter键,命令行不会在新行中打印,而是在上一行的旁边打印。与ssh中的-t-t选项有关。@SuperBiasedMan提供了一些带有编辑的输出。t-t-t选项强制ssh在对等机上使用pty。这意味着您可以获得终端控制字符。但是你的长而难读的字符串是从哪里来的呢?您是否在Python变量中捕获它?谢谢您的回答。ctrl-c就是一个例子,我将通过子流程模块(p.kill()或p.terminate())终止或终止流程,因此我不关心向子流程转发信号。stdin=subprocess.PIPE成功了。如果他不在远程系统上分配tty,那么发送Ctrl-C不会有任何特别的效果。tty驱动程序将字符转换为INTR信号。