我正在使用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')
这是日志文件。
TIMEOUT: Timeout exceeded.
<pexpect.spawn object at 0xb5ec558c>
version: 3.2
command: /usr/bin/sudo
args: ['/usr/bin/sudo', 'apt-get', 'install', 'vlc']
searcher: <pexpect.searcher_re object at 0xb565710c>
buffer (last 100 chars): '[sudo] password for user1: '
before (last 100 chars): '[sudo] password for user1: '
after: <class 'pexpect.TIMEOUT'>
match: None
match_index: None
exitstatus: None
flag_eof: False
pid: 27641
child_fd: 4
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: <open file '<stdout>', mode 'w' at 0xb74d8078>
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1
更新:
密码发送得很好。它也期望下一行,但随后进入&#34; Y&#34;什么都不做。
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')
求助:
我需要在最后添加这一行。
child.expect(pexpect.EOF, timeout=None)
答案 0 :(得分:1)
尝试public HttpResponseMessage Post(AddressModel addressModel)
{
if (addressModel.id != null)
throw new Exception("identifier cannot be set"); // or return BadRequest
using (var context = new DbContext())
{
addressModel.id = GetNewId();
// GetNewId generate the next correct if from data
// from context.address.last ...
...
}
}
。
来自文档:
expect()方法等待子应用程序返回给定的字符串。您指定的字符串是正则表达式,因此您可以匹配复杂的模式。
优良作法是仅在意图与正则表达式匹配时才使用child.expect_exact()
。
答案 1 :(得分:1)
当前的问题是:
child.expect('[sudo] password for user1: ')
使用正则表达式。 [...]
构造在正则表达式中具有特殊含义,因此您实际等待的是其中一个字母“d”,“o”,“s”或“u”后跟文本{{ 1}}。但是password for user1:
首先发送文本sudo
,而正则表达式与之不匹配,因为它的最后一个字符是[sudo]
而不是其中一个字母。
有很多可能的解决方案。您可以将其与]
匹配。你可以按照JLeClerc的建议使用password for user1:
(我也赞成这个解决方案)。您可以转义正则表达式中的括号,因此它们没有通常的含义:expect_exact()
(请注意,当将其指定为Python字符串时,您需要将反斜杠加倍或使用原始字符串文字)。
另一个问题是,如果您在最近几分钟内已经提供了密码,则可能不会提示您输入密码。然后\[sudo\]
电话肯定会超时等待它。解决此问题的最简单方法是首先发布expect()
。您甚至可以在同一命令行上执行此操作:
sudo -k