我有一个命令./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
答案 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,读取所有输出,并等待子进程完成。
第二个问题是由于缓冲(只有在你没有一次读取所有输出时才有意义)。修复缓冲:
sys.stdout.flush()
bufsize
参数设置为零pexpect
, pty
modules或stdbuf
, unbuffer
, script
commands。