Python subprocess.Popen stdout添加了空格和腐败术语

时间:2016-04-14 18:35:56

标签: python terminal subprocess output stdout

好的,好的。我正在编写一个非常基本的Python脚本,它只接受来自df -h的输出并在屏幕上显示它。我要实现其他一些功能,但这部分让我感到难过。

我非常确定我的代码是正确的,我甚至在time.sleep()语句中查看输出是否输得太快。但是当我遍历stdout时,即使使用rstrip(),每次创建新行时终端输出都会奇怪地间隔,并且会破坏终端。

Anythoughts?

这是我的代码:

    #!/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 - 服务帐户

我输了。 。 .quite失去了

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

-t切换到ssh会强制您的终端进入原始模式。原始模式会在行尾失去隐式回车符,并且会混淆文本输入。

来自the man page:&#34; [ - t]可用于在远程机器上执行任意基于屏幕的程序,这可能非常有用,例如在实施菜单服务时。&#34;

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

答案 2 :(得分:0)

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

-T禁用伪tty分配。