【问题标题】:python pexpect commands not executed in correct orderpython pexpect 命令未按正确顺序执行
【发布时间】:2023-01-17 23:59:31
【问题描述】:

我正在运行 python pexpect 来自动化一个名为 IRIS 的应用程序

我只是输入一整套只有 2 个命令。例如:



    set db=##Class(SYS.Database).%OpenId("/document-txt")
    if db.Mirrored=0 {w "/document-txt/IRIS.DAT NOT mirrored"} else {w "/document-txt/IRIS.DAT mirrored"}

第一个命令设置变量 db,第二个命令是 IRIS“objectscript”中的“if”语句 它测试是否在第一个命令中设置了变量并输出文本消息

如果我手动输入命令,会话应该如下所示:



    %SYS>set db=##Class(SYS.Database).%OpenId("/analytics")
    %SYS>if db.Mirrored=0 {w "/analytics/IRIS.DAT NOT mirrored"} else {w "/analytics/IRIS.DAT mirrored"}
    /analytics/IRIS.DAT NOT mirrored
    %SYS>set db=##Class(SYS.Database).%OpenId("/anlt-facts")
    %SYS>if db.Mirrored=0 {w "/anlt-facts/IRIS.DAT NOT mirrored"} else {w "/anlt-facts/IRIS.DAT mirrored"}
    /anlt-facts/IRIS.DAT NOT mirrored
    %SYS>set db=##Class(SYS.Database).%OpenId("/anlt-historylogs")
    %SYS>if db.Mirrored=0 {w "/anlt-historylogs/IRIS.DAT NOT mirrored"} else {w "/anlt-historylogs/IRIS.DAT mirrored"}
    /anlt-historylogs/IRIS.DAT NOT mirrored

这就是我 [从预期日志] 得到的:



    %SYS>set db=##Class(SYS.Database).%OpenId("/trak/analytics")
    set db=##Class(SYS.Database).%OpenId("/analytics")
    %SYS>if db.Mirrored=0 {w "/analytics/IRIS.DAT NOT mirrored"} else {w "/analytics/IRIS.DAT mirrored"} set db=##Class(SYS.Database).%OpenId("/anlt-facts")
    if db.Mirrored=0 {w "/analytics/IRIS.DAT NOT mirrored"} else {w "/analytics/IRIS.DAT mirrored"}
    /analytics/IRIS.DAT NOT mirrored 
    %SYS>if db.Mirrored=0 {w "/anlt-facts/IRIS.DAT NOT mirrored"} else {w "/anlt-facts/IRIS.DAT mirrored"} 
    %SYS>if db.Mirrored=0 {w "/anlt-facts/IRIS.DAT NOT mirrored"} else {w "/anlt-facts/IRIS.DAT mirrored"}
    /anlt-facts/IRIS.DAT NOT mirrored 
    %SYS>if db.Mirrored=0 {w "/anlt-historylogs/IRIS.DAT NOT mirrored"} else {w "/anlt-historylogs/IRIS.DAT mirrored"}
    set db=##Class(SYS.Database).%OpenId("/anlt-local")
    if db.Mirrored=0 {w "/anlt-local/IRIS.DAT NOT mirrored"} else {w "/anlt-local/IRIS.DAT mirrored"}
    set db=##Class(SYS.Database).%OpenId("/anlt-localsys")
    set db=##Class(SYS.Database).%OpenId("/anlt-historylogs")
    %SYS>
    %SYS>if db.Mirrored=0 {w "/anlt-historylogs/IRIS.DAT NOT mirrored"} else {w "/anlt-historylogs/IRIS.DAT mirrored"}
    /anlt-historylogs/IRIS.DAT NOT mirrored

任何人都可以看出为什么 pexecect 没有以正确的顺序执行命令吗?那就是一行一行
它似乎在排队一些命令。

我给了 5 秒来执行每个命令,这应该足够了。

这是代码:



    ----Starting the IRIS session
    s = pexpect.spawn('bash',echo=False)
    s.logfile=open("/tmp/IRIS.log","wb")
    s.expect('#')
    s.sendline('iris session')
    s.expect('%SYS>')

    ----Sending the commands from a file:
    file1 = open('/tmp/mstatus', 'r')
    for line in file1:
    s.sendline(line)
    try:
    status=s.expect('%SYS>')
    time.sleep(5)
    except pexpect.TIMEOUT:
    print(f"IRIS session command prompt at {count}.. timeout")
    s.interact()
    except pexpect.EOF:
    print(f"IRIS session command prompt at {count} - Child process died")
    s.interact()
    except pexpect.ExceptionPexpect as e:
    print(f"IRIS session command prompt at {count}")
    print(e)
    s.interact()

    file1.close()

【问题讨论】:

  • 请缩进您的 Python 代码,使其可读且语法正确。

标签: pexpect


【解决方案1】:

使用 for line in file1 读取文件时,每一行都包含终止换行符。 Pexpect.sendline(line) 添加了另一个换行符。因此,您在每个命令后发送了一个空白命令行,因此得到了两个提示,并且错误地匹配了第二个提示。

请改用Pexpect.send(line)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    相关资源
    最近更新 更多