写入标准输入并正确打印输出结果

时间:2013-04-11 09:44:56

标签: python subprocess stdin

我有一个命令./rancli -c -我输入了一个包含此文档的shell:

  

从Linux shell运行该工具允许其他选项,   取决于给命令的选项。选项如下   如下:

     

-h显示有关命令的帮助

     

-c不是从用户交互地获取类型命令,而是从命名文件中读取命令,即以批处理模式。   处理完所有命令后,CLI会话将自动结束。

     

-c - 如上所述但是从Linux标准输入读取命令。这允许命令“管道”到程序。

我想把它转换成python。如果我使用第二个选项一切正常,它会从文件读取命令并在屏幕上显示结果。但是我想使用写入stdin的第三个选项。我原以为这行会运行一个命令./rancli -c - commandHere,但事实并非如此。我要做的是输入./rancli -c -然后我可以在下一行手动写入stdin,例如在这里我使用命令read hnb

[root@switch]# ./rancli -c -
read hnb
RAN> read hnb
               HNBId                           Location      RegUEs   ActUEs
  000295-0000038828@ipaccess.com                    n/c
  000295-0000070688@ipaccess.com                    n/c

当我在shell中输入它时,我得到的结果打印得很好。但是,当我在我的python中这样做时,我没有正确地将结果打印回给我。这是我试过的:

    ran_opt_get_ap  = "read hnb\n"
    cmd_rancli = ["/jffs2/usbflash0/ran/rancli", "-c", "-"]
    proc = subprocess.Popen(cmd_rancli + [ran_opt_get_ap], stdout=subprocess.PIPE)    
    for line in iter(proc.stdout.readline, ''): 
        print line,
    proc.wait()

所以当我传递一个类似的命令时,它显然不会像在shell中那样工作而被忽略。现在这里有两个问题,如何在这里将命令写入stdin,因为我必须手动输入以下命令read hnb?在我运行rancli -c -之后,我想在之后注入命令,我现在必须这样输入:

read hnb                                                                        
RAN> read hnb                   

另一个问题是我的代码没有打印出上面的完整结果,但是当我输入下一个命令时,我得到剩下的结果和下一个结果的第一行,依此类推,每个命令,得到结果在我输入下一个命令之后:

get ap                                                                          
               HNBId                           Location      RegUEs   ActUEs    
  000295-0000038828@ipaccess.com                    n/c                         
  000295-0000070688@ipaccess.com                    n/c                         
RAN> get ap 

更新:最新代码有效

cmd_rancli = ["/jffs2/usbflash0/ran/rancli", "-c", "-"]
ran_opt_get_ap = "read hnb"
proc = subprocess.Popen(cmd_rancli, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
output = proc.communicate(ran_opt_get_ap)[0] 
print output

1 个答案:

答案 0 :(得分:4)

要写入子进程'stdin,请将其设置为PIPE:

from subprocess import Popen, PIPE

p = Popen(cmd_rancli, stdin=PIPE, stdout=PIPE)
output = p.communicate(ran_opt_get_ap)[0]

.communicate()ran_opt_get_ap写入子进程'stdin,读取所有输出,并等待子进程完成。

第二个问题是由于缓冲(只有在你没有一次读取所有输出时才有意义)。修复缓冲: