gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:56:13 28 4
gpt4 key购买 nike

我有一个命令 ./rancli -c - 我在一个有这个文档的 shell 中输入:

Running the tool from the Linux shell allows additional options, depending on the options given to the command. The options are as follows:

-h Displays help about the command

-c Instead of taking typed commands interactively from a user the commands are read from the named file, i.e. in batch mode. When all commands are processed the CLI session ends automatically.

-c - As above but reads command from Linux stdin. This allows commands to be ‘piped’ to the program.

我想把它转换成 python。如果我使用第二个选项,一切正常,它从文件中读取命令并将结果显示在屏幕上。但是我想使用写入标准输入的第三个选项。我原以为这一行会运行命令 ./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 中那样工作,因此被忽略了。现在这里有两个问题,我如何在此处将命令写入标准输入,因为我必须手动键入以下命令 read hnb?在我运行 rancli -c - 之后我想然后注入(inject)命令,我现在必须像这样输入它:

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

最佳答案

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

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

关于python - 写入标准输入并正确打印结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15945585/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com