2

./rancli -c -我在具有此文档的外壳中输入了一个命令:

从 Linux shell 运行该工具允许附加选项,具体取决于为命令提供的选项。选项如下:

-h 显示有关命令的帮助

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

-c - 同上,但从 Linux 标准输入读取命令。这允许将命令“传送”到程序。

我想把它转换成python。如果我使用第二个选项,一切正常,它会从文件中读取命令并在屏幕上显示结果。但是我想使用写入标准输入的第三个选项。我原以为这条线会运行一个命令./rancli -c - commandHere,但事实并非如此。我要做的是输入./rancli -c -,然后我可以在下一行手动写入标准输入,比如这里我使用命令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 中那样工作并且被忽略。现在这里有两个问题,我如何在这里将命令写入标准输入,因为我必须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
4

1 回答 1

4

要写入子进程的标准输入,请将其设置为 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子进程的标准输入,读取所有输出,并等待子进程完成。

第二个问题是由于缓冲(仅当您不一次读取所有输出时才重要)。修复缓冲:

于 2013-04-11T09:58:26.133 回答