【问题标题】:Suppress output of subprocess抑制子进程的输出
【发布时间】:2016-11-01 01:54:03
【问题描述】:

我想使用 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, 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

【问题讨论】:

  • 你能提供样本输出吗?目前还不清楚你所说的“加扰”是什么意思。
  • stackoverflow 将对齐所有内容。换行后输出不会与终端的开头对齐。消息打印正确。
  • 如果我 ctrl-c 并返回我的终端,按 enter 命令行不是在新行中打印,而是在我的上一行旁边打印。与 ssh 中的 -t -t 选项有关。
  • @SuperBiasedMan 提供了一些带有编辑的输出。
  • Tthe -t -t 选项强制 ssh 在对等方上使用 pty。这意味着您可以获得终端控制字符。但是你的 又长又难读的字符串 是从哪里来的呢?您是否在 Python 变量中捕获它?

标签: python python-2.7 ssh subprocess


【解决方案1】:

好的,现在输出很清楚了。我不知道为什么,但是命令ssh -t -t 将本地终端置于原始模式。无论如何它是有道理的,因为它旨在允许您直接在遥控器上使用curses程序(例如vi),在这种情况下,不应该进行任何转换,即使是简单的\n -> \r\n允许一个简单的新行将光标留在第一列。但我在 ssh 文档中找不到这方面的参考资料。

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

恕我直言,这是 设计气味,因为您仅使用 pty 分配的副作用将 Ctrl + C 传递给遥控器,而您会遭受另一面的痛苦效果,这是本地系统上的原始模式。您应该处理标准输入 (stdinput = subprocess.PIPE) 并在本地键盘上输入特殊字符时显式发送 chr(3),或者为 SIG-INT 安装信号处理程序。

或者,作为一种解决方法,您可以在启动远程命令后简单地使用类似os.system("stty opost -igncr")(或更好的等效子进程)的东西,以可接受的模式重置本地终端。

【讨论】:

  • 感谢您的回答。 ctrl-c 是一个示例,实际上我将通过子进程模块(p.kill() 或 p.terminate())终止或终止进程,因此我不关心将信号转发到子进程。 stdin=subprocess.PIPE 成功了。
  • 如果他没有在远程系统上分配tty,那么发送Ctrl-C不会有任何特别的效果。 tty 驱动程序将字符转换为 INTR 信号。
猜你喜欢
  • 2018-10-04
  • 2023-03-18
  • 2021-05-08
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 2016-03-07
相关资源
最近更新 更多