【问题标题】:Python subprocess.Popen stdout adds spaces and corrupts termPython subprocess.Popen stdout 添加空格并破坏术语
【发布时间】:2016-08-06 11:46:47
【问题描述】:

好的,所以。我正在编写一个非常基本的 Python 脚本,它只从 df -h 获取输出并将其显示在屏幕上。我打算实现一些其他功能,但这部分让我很困惑。

我很确定我的代码是正确的,我什至输入了 time.sleep() 语句来查看输出是否过快。但是,当我遍历标准输出时,即使使用 rstrip(),每次创建新行时,终端输出的间距都会很奇怪,并且会破坏终端。

有什么想法吗?

这是我的代码:

    #!/usr/bin/python

import sys
import os
import re
import subprocess
import time

np1=subprocess.Popen('ssh -qt <redacted>/usr/bin/sudo df -h /opt/saswork', shell=True, stdout=subprocess.PIPE)
np2=subprocess.Popen('ssh -qt <redacted>/usr/bin/sudo df -h /opt/saswork', shell=True, stdout=subprocess.PIPE)
p1=subprocess.Popen('ssh -qt <redacted>/usr/bin/sudo df -h /opt/saswork', shell=True, stdout=subprocess.PIPE)
p2=subprocess.Popen('ssh -qt <redacted>/usr/bin/sudo df -h /opt/saswork', shell=True, stdout=subprocess.PIPE)
p3=subprocess.Popen('ssh -qt <redacted>/usr/bin/sudo df -h /opt/saswork', shell=True, stdout=subprocess.PIPE)
p4=subprocess.Popen('ssh -qt <redacted>/usr/bin/sudo df -h /opt/saswork', shell=True, stdout=subprocess.PIPE)


for x in np1.stdout:
    x=x.rstrip()
    x=re.findall('.\d%', x)
    for y in x:
        print "SAS Grid NP01 is at ", str(y)
time.sleep(1)
for x in np2.stdout:
    x=x.rstrip()
    x=re.findall('.\d%', x)
    for y in x:
        print "SAS Grid NP02 is at ", str(y)
time.sleep(1)
for x in p1.stdout:
    x=x.rstrip()
    x=re.findall('.\d%', x)
    for y in x:
        print "SAS Grid P01 is at ", str(y)
time.sleep(1)
for x in p2.stdout:
    x=x.rstrip()
    x=re.findall('.\d%', x)
    for y in x:
        print "SAS Grid P02 is at ", str(y)
time.sleep(1)
for x in p3.stdout:
    x=x.rstrip()
    x=re.findall('.\d%', x)
    for y in x:
        print "SAS Grid P03 is at ", str(y)
time.sleep(1)
for x in p4.stdout:
    x=x.rstrip()
    x=re.findall('.\d%', x)
    for y in x:
        print "SAS Grid P04 is at ", str(y)

这是输出

SAS Grid NP01 is at  33%
                    SAS Grid NP02 is at  36%
                                            SAS Grid P01 is at   3%
                                                                   SAS Grid P02 is at  23%
                                                                                          SAS Grid P03 is at  41%
                                                                                                                 SAS Grid P04 is at  24%
                                                                                                                                        [<service account>@werindgatep01 ~]$
                                                                                                                                                                 [<service account>@werindgatep01 ~]$

此时我必须做的是 CTRL-C 和 CTRL-D,直到它让我退出服务帐户并返回到我的标准用户帐户。从那里我可以 sudo su - 服务帐户

我迷路了。 . .迷路了

【问题讨论】:

  • 在您提出下一个问题之前,请阅读How to Ask,更具体地说,请阅读minimal reproducible example。减小示例程序的大小并去除无关元素将提高您收到的响应的质量。
  • 您使用的是什么操作系统?如果是Linux,什么发行版和版本?
  • print 语句是在它打印的内容之间添加空格。每次在逗号分隔的列表中你给它它都会插入一个空格。为了更好地控制使用函数形式,或者只使用sys.stdout.write() 方法。
  • 如果在Popen() 之后添加print "abc"; print "def\r"; print "gh" 会发生什么?
  • 我遇到了类似的问题,你能解决这个问题吗?

标签: python terminal subprocess output stdout


【解决方案1】:

我认为您的.findall() 正则表达式中的点正在拾取一个制表符。尝试检查并删除它...?

【讨论】:

    【解决方案2】:

    -t 切换到ssh 会强制您的终端进入原始模式。原始模式会破坏行尾的隐式回车,并打乱您的文本输入。

    来自the man page:“[-t] 可用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。” p>

    由于您没有运行可视化编辑器或其他基于屏幕的程序,我建议您丢失-t

    【讨论】:

    • 我不认为这是正确的。 -t 开关只是强制打开和使用 pty,而不是在给出命令时切换到管道。该应用程序是设置模式的原因。
    • 那是 . . 。奇怪。我不会撒谎,我不认为这会奏效,但我只是试了一下,它似乎坚持了下来。我会继续开发这个脚本,如果它坚持下去,你就会解开我剩下的一点头发的谜团!
    【解决方案3】:

    我遇到了类似的问题,但通过在 SSH 命令中添加“-T”选项来解决它。

    -T 禁用伪终端分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2014-09-10
      • 1970-01-01
      相关资源
      最近更新 更多