Python 如何在我的程序中不使用interact()执行pexpect命令

Python 如何在我的程序中不使用interact()执行pexpect命令,python,linux,pexpect,Python,Linux,Pexpect,我有一个使用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()

我有一个使用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.interactive()取消对该行的注释,它确实可以工作。但是,这将控制权交给了用户,我需要手动退出程序


为什么函数在没有交互的情况下不执行命令?我该怎么做才能使它工作?

在输入密码后,您将立即插入命令,这是在远端准备接收您的命令之前


您需要在发送命令之前得到远程提示。

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

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\u-exact()
,它使用纯字符串匹配而不是正则表达式。

在命令后添加
p.expect(prompt)
,等待命令完成。我尝试过,但行为没有改变。在提示符中转义美元符号:
r'\$'
(否则,
$
是模式中的一个regex元字符)感谢您的帮助。但匹配提示是否真的有问题?如果是,程序会在每个expect(提示)上超时?但它似乎与不等待远程端有关(请参阅匿名Pyton Hack回答中的我的评论)。我将尝试更改提示字符串。您先试试如何?我的猜测(可能是错误的)是,
'.*$'
模式匹配任何内容(包括空输入)。但这不是我在发送行之前编写p.expect(prompt)时所做的吗?我尝试在发送行(命令)之后添加expect(prompt)),但它似乎不起作用。你的建议让我试着在发送线路之后再睡一次,这实际上使它起了作用。因此,它与等待提示有关。