use*_*279 5 python linux ubuntu pexpect
我正在开发一个 python 程序来协助 apt-get 工具。我想使用 pexpect 下载所选的包。我相信我陷入了 child.expect 线。当涉及到该行时,似乎超时了。
butt = "vlc"
child = pexpect.spawn('sudo apt-get install ' + butt)
child.logfile = sys.stdout
child.expect('[sudo] password for user1: ')
child.sendline('mypassword')
Run Code Online (Sandbox Code Playgroud)
这是日志文件。
butt = "vlc"
child = pexpect.spawn('sudo apt-get install ' + butt)
child.logfile = sys.stdout
child.expect('[sudo] password for user1: ')
child.sendline('mypassword')
Run Code Online (Sandbox Code Playgroud)
更新:
密码发送得很好。它还期望下一行,但随后输入“Y”并且不执行任何操作。
child = pexpect.spawn('sudo apt-get install ' + butt)
child.logfile = sys.stdout
child.expect_exact('[sudo] password for user1: ')
child.sendline('mypass')
child.expect_exact('Do you want to continue? [Y/n] ')
child.sendline('Y')
Run Code Online (Sandbox Code Playgroud)
解决了:
我需要在最后添加这一行。
child.expect(pexpect.EOF, timeout=None)
Run Code Online (Sandbox Code Playgroud)
小智 5
尝试child.expect_exact()。
来自文档:
Expect() 方法等待子应用程序返回给定的字符串。您指定的字符串是正则表达式,因此您可以匹配复杂的模式。
最好expect()仅在意图匹配正则表达式时使用。
眼前的问题是:
child.expect('[sudo] password for user1: ')
Run Code Online (Sandbox Code Playgroud)
使用正则表达式。该[...]构造在正则表达式中具有特殊含义,因此您实际上等待的是字母“d”、“o”、“s”或“u”之一,后跟文本password for user1:。但是首先sudo发送文本[sudo],正则表达式与该文本不匹配,因为它的最后一个字符不是]这些字母之一。
对此有多种可能的解决方案。你可以让它匹配password for user1:。expect_exact()您可以按照 JLeClerc 的建议使用(这是我也喜欢的解决方案)。您可以转义正则表达式中的方括号,这样它们就不再具有通常的含义:(\[sudo\]请注意,当将其指定为 Python 字符串时,您需要使用双反斜杠或使用原始字符串文字)。
另一个问题是,如果您在过去几分钟内已经提供了密码,系统可能不会提示您输入密码。那么expect()调用肯定会超时等待。解决这个问题最简单的方法就是sudo -k先发出问题。您甚至可以在同一命令行上执行此操作:
child = pexpect.spawn('sudo -k; sudo apt-get install ' + butt)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4436 次 |
| 最近记录: |