gpt4 book ai didi

python - 从外部程序交互式写入/读取

转载 作者:太空宇宙 更新时间:2023-11-04 01:05:21 25 4
gpt4 key购买 nike

背景故事:我是 Python 的新手,但在 Perl 方面相当有经验。我正在努力使我在系统管理员事件领域的脚本组合多样化。

我正在尝试通过我的 python 脚本与外部进程进行动态通信。

我想做的是:

  • 调用一个可执行文件(我们称之为“cli”)
  • 写一行到cli
  • 在内部阅读回复
  • 逐个遍历响应,然后将另一行写入 CLI
  • 将 cli 的响应打印回控制台

我希望这会产生的结果是:

(spawn process) /usr/local/bin/cli
-> show listofobjects
<- (read back list of objects internally)
-> (one by one, write a line to the cli for each of the list of objects)
-> get objectname modifiedtime
<- (print response from above command)

这是我目前的代码:

import shlex, subprocess, re

clicmd = "/usr/local/bin/cli -s 10.1.213.226 -n Administrator -p password"
cliargs = shlex.split(clicmd)
cliproc = subprocess.Popen(cliargs,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)

tmpclicmd = "LIST objects OUTPUT csv NAME"
cliret = cliproc.communicate(input=tmpclicmd)[0]
regex = re.compile('^\".*')

for line in cliret.split('\n'):
if regex.match(line):
procline = line.replace('"','')
if 'NAME' not in procline:
clideets = subprocess.Popen(cliargs,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
clideetscmd = 'modify objects ' + procline
clideets.communicate(input=clideetscmd)
clideetscmd = 'list objectdetails'
clideetsresp = clideets.communicate(input=clideetscmd)[0]

print clideetsresp;

我可能以完全错误的方式解决了这个问题。我是否必须为每一步生成一个新的 Popen?我怎样才能做得更好? (另一个模块等)。归根结底,我无法让 cli 关闭,而 Popen 似乎在每一步之后都会这样做。

提前致谢!

最佳答案

  1. 不必为每次交互都启动一个新进程(使用 Popen)。但是,当您使用 communicate 时,您会这样做用于将数据发送到流程,因为,如文档所述:

    Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate.

    相反,只需写入 cliproc.stdin 并从 cliproc.stdout 读取:

    cliproc.stdin.write("LIST objects OUTPUT csv NAME")
    cliret = cliproc.stdout.readline()

    进程以这种方式保持事件状态。

  2. 我不知道你为什么在这里使用shlex模块:

    clicmd = "/usr/local/bin/cli -s 10.1.213.226 -n Administrator -p password"
    cliargs = shlex.split(clicmd)

    内置 str.split方法会很好:

    clicmd = "/usr/local/bin/cli -s 10.1.213.226 -n Administrator -p password"
    cliargs = clicmd.split()

    或者您可以自己编写结果列表:

    cliargs = ["/usr/local/bin/cli", "-s", "10.1.213.226",
    "-n", "Administrator", "-p", "password"]
  3. 这里不需要分号:

    print clideetsresp;

关于python - 从外部程序交互式写入/读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30741685/

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