【问题标题】:How to make pexpect commands execute without interact() in my program如何在我的程序中使 pexpect 命令在没有 interact() 的情况下执行
【发布时间】:2015-10-14 13:20:56
【问题描述】:

我有这个使用 pexpect 的 python 函数,看起来像这样:

  def executeCommandWithOtherUser(command):
    p = pexpect.spawn('su', ['otherUser'])
    p.expect('Password:')
    p.sendline('1234')
    prompt = '.*$'
    p.expect(prompt)
    p.sendline(command)

    #p.interact()
    p.close()
    return

当我尝试此代码时,它不会执行命令(使用例如 touch x.txt 进行测试)。如果我启用 pexpect 日志记录,我可以看到该命令,但程序完成时没有发生任何事情。如果我用 p.interact() 取消注释该行,它确实有效。但是,这会将控制权交给用户,我需要手动退出程序。

为什么函数不交互不执行命令?我该怎么做才能让它发挥作用?

【问题讨论】:

  • 在命令之后添加p.expect(prompt),等待命令完成。
  • 我试过了,但行为没有改变。
  • 转义提示符中的美元符号:r'\$'(否则 $ 是模式内的正则表达式元字符)
  • 感谢您的帮助。但是匹配提示真的有问题吗?如果是,程序会在每个期望(提示)上超时吗?但这似乎与不等待远程结束有关(请参阅我在匿名 pyhton hacke 的回答中的评论)。我会尝试更改提示字符串。
  • 你先试试怎么样?我的猜测(我可能弄错了)是 '.*$' 模式匹配 anything(包括空输入)。

标签: python linux pexpect


【解决方案1】:

您在输入密码后立即插入您的命令 -- 这是在远程端准备好接收您的命令之前。

在发送命令之前,您需要等待远程提示。

【讨论】:

  • 但这不就是我在 sendline 之前写 p.expect(prompt) 时所做的吗?我试图在 sendline(command)) 之后添加 expect(prompt),但它似乎不起作用。您的建议使我在 sendline 之后尝试 time.sleep,这实际上使它起作用。所以它与等待提示有关。
【解决方案2】:

问题是没有正确指定提示正则表达式(prompt = '.*$')。当前的提示字符串正则表达式也将匹配空输入,因为 $ 具有特殊的正则表达式含义并且不使用 \ 进行转义。以下代码有效:

def executeCommandWithOtherUser(command):
  p = pexpect.spawn('su', ['otherUser'])
  p.expect('Password:')
  p.sendline('1234')
  prompt = r'\$'
  p.expect(prompt)
  p.sendline(command)
  p.expect(prompt)
  p.close()
  return 

expect() 的替代方法是使用expect_exact(),它使用纯字符串匹配而不是正则表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2012-07-15
    相关资源
    最近更新 更多