从外部程序交互式地写/读

2024-09-27 21:30:12 发布

您现在位置:Python中文网/ 问答频道 /正文

背景:我对Python很陌生,但对Perl有相当的经验。我正在尝试在sysadmin活动区域中多样化我的脚本组合。

我正试图通过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;

我可能完全错了。我是不是每走一步都要产生一个新的波本?我怎么能做得更好呢?(另一个模块等)。在一天结束时,我不能让cli关闭在我身上,Popen似乎在每一步之后都会这样做。你知道吗

提前谢谢!你知道吗


Tags: of脚本inputcliobjectslinelistsubprocess
1条回答
网友
1楼 · 发布于 2024-09-27 21:30:12
  1. 没有必要为每个交互启动一个新进程(使用Popen)。但是,当您使用^{}向进程发送数据时,您会这样做,因为正如文档所述:

    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)
    

    内置的^{}方法很好:

    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;
    

相关问题 更多 >

    热门问题