##// END OF EJS Templates
Remove string module use from external modules.
Thomas Kluyver -
Show More
@@ -1,275 +1,274 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """String interpolation for Python (by Ka-Ping Yee, 14 Feb 2000).
2 """String interpolation for Python (by Ka-Ping Yee, 14 Feb 2000).
3
3
4 This module lets you quickly and conveniently interpolate values into
4 This module lets you quickly and conveniently interpolate values into
5 strings (in the flavour of Perl or Tcl, but with less extraneous
5 strings (in the flavour of Perl or Tcl, but with less extraneous
6 punctuation). You get a bit more power than in the other languages,
6 punctuation). You get a bit more power than in the other languages,
7 because this module allows subscripting, slicing, function calls,
7 because this module allows subscripting, slicing, function calls,
8 attribute lookup, or arbitrary expressions. Variables and expressions
8 attribute lookup, or arbitrary expressions. Variables and expressions
9 are evaluated in the namespace of the caller.
9 are evaluated in the namespace of the caller.
10
10
11 The itpl() function returns the result of interpolating a string, and
11 The itpl() function returns the result of interpolating a string, and
12 printpl() prints out an interpolated string. Here are some examples:
12 printpl() prints out an interpolated string. Here are some examples:
13
13
14 from Itpl import printpl
14 from Itpl import printpl
15 printpl("Here is a $string.")
15 printpl("Here is a $string.")
16 printpl("Here is a $module.member.")
16 printpl("Here is a $module.member.")
17 printpl("Here is an $object.member.")
17 printpl("Here is an $object.member.")
18 printpl("Here is a $functioncall(with, arguments).")
18 printpl("Here is a $functioncall(with, arguments).")
19 printpl("Here is an ${arbitrary + expression}.")
19 printpl("Here is an ${arbitrary + expression}.")
20 printpl("Here is an $array[3] member.")
20 printpl("Here is an $array[3] member.")
21 printpl("Here is a $dictionary['member'].")
21 printpl("Here is a $dictionary['member'].")
22
22
23 The filter() function filters a file object so that output through it
23 The filter() function filters a file object so that output through it
24 is interpolated. This lets you produce the illusion that Python knows
24 is interpolated. This lets you produce the illusion that Python knows
25 how to do interpolation:
25 how to do interpolation:
26
26
27 import Itpl
27 import Itpl
28 sys.stdout = Itpl.filter()
28 sys.stdout = Itpl.filter()
29 f = "fancy"
29 f = "fancy"
30 print "Is this not $f?"
30 print "Is this not $f?"
31 print "Standard output has been replaced with a $sys.stdout object."
31 print "Standard output has been replaced with a $sys.stdout object."
32 sys.stdout = Itpl.unfilter()
32 sys.stdout = Itpl.unfilter()
33 print "Okay, back $to $normal."
33 print "Okay, back $to $normal."
34
34
35 Under the hood, the Itpl class represents a string that knows how to
35 Under the hood, the Itpl class represents a string that knows how to
36 interpolate values. An instance of the class parses the string once
36 interpolate values. An instance of the class parses the string once
37 upon initialization; the evaluation and substitution can then be done
37 upon initialization; the evaluation and substitution can then be done
38 each time the instance is evaluated with str(instance). For example:
38 each time the instance is evaluated with str(instance). For example:
39
39
40 from Itpl import Itpl
40 from Itpl import Itpl
41 s = Itpl("Here is $foo.")
41 s = Itpl("Here is $foo.")
42 foo = 5
42 foo = 5
43 print str(s)
43 print str(s)
44 foo = "bar"
44 foo = "bar"
45 print str(s)
45 print str(s)
46 """
46 """
47
47
48 #*****************************************************************************
48 #*****************************************************************************
49 #
49 #
50 # Copyright (c) 2001 Ka-Ping Yee <ping@lfw.org>
50 # Copyright (c) 2001 Ka-Ping Yee <ping@lfw.org>
51 #
51 #
52 #
52 #
53 # Published under the terms of the MIT license, hereby reproduced:
53 # Published under the terms of the MIT license, hereby reproduced:
54 #
54 #
55 # Permission is hereby granted, free of charge, to any person obtaining a copy
55 # Permission is hereby granted, free of charge, to any person obtaining a copy
56 # of this software and associated documentation files (the "Software"), to
56 # of this software and associated documentation files (the "Software"), to
57 # deal in the Software without restriction, including without limitation the
57 # deal in the Software without restriction, including without limitation the
58 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
58 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
59 # sell copies of the Software, and to permit persons to whom the Software is
59 # sell copies of the Software, and to permit persons to whom the Software is
60 # furnished to do so, subject to the following conditions:
60 # furnished to do so, subject to the following conditions:
61 #
61 #
62 # The above copyright notice and this permission notice shall be included in
62 # The above copyright notice and this permission notice shall be included in
63 # all copies or substantial portions of the Software.
63 # all copies or substantial portions of the Software.
64 #
64 #
65 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
65 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
66 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
66 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
67 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
67 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
68 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
68 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
69 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
69 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
70 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
70 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
71 # IN THE SOFTWARE.
71 # IN THE SOFTWARE.
72 #
72 #
73 #*****************************************************************************
73 #*****************************************************************************
74
74
75 __author__ = 'Ka-Ping Yee <ping@lfw.org>'
75 __author__ = 'Ka-Ping Yee <ping@lfw.org>'
76 __license__ = 'MIT'
76 __license__ = 'MIT'
77
77
78 import string
79 import sys
78 import sys
80 from tokenize import tokenprog
79 from tokenize import tokenprog
81
80
82 class ItplError(ValueError):
81 class ItplError(ValueError):
83 def __init__(self, text, pos):
82 def __init__(self, text, pos):
84 self.text = text
83 self.text = text
85 self.pos = pos
84 self.pos = pos
86 def __str__(self):
85 def __str__(self):
87 return "unfinished expression in %s at char %d" % (
86 return "unfinished expression in %s at char %d" % (
88 repr(self.text), self.pos)
87 repr(self.text), self.pos)
89
88
90 def matchorfail(text, pos):
89 def matchorfail(text, pos):
91 match = tokenprog.match(text, pos)
90 match = tokenprog.match(text, pos)
92 if match is None:
91 if match is None:
93 raise ItplError(text, pos)
92 raise ItplError(text, pos)
94 return match, match.end()
93 return match, match.end()
95
94
96 class Itpl:
95 class Itpl:
97 """Class representing a string with interpolation abilities.
96 """Class representing a string with interpolation abilities.
98
97
99 Upon creation, an instance works out what parts of the format
98 Upon creation, an instance works out what parts of the format
100 string are literal and what parts need to be evaluated. The
99 string are literal and what parts need to be evaluated. The
101 evaluation and substitution happens in the namespace of the
100 evaluation and substitution happens in the namespace of the
102 caller when str(instance) is called."""
101 caller when str(instance) is called."""
103
102
104 def __init__(self, format,codec='utf_8',encoding_errors='backslashreplace'):
103 def __init__(self, format,codec='utf_8',encoding_errors='backslashreplace'):
105 """The single mandatory argument to this constructor is a format
104 """The single mandatory argument to this constructor is a format
106 string.
105 string.
107
106
108 The format string is parsed according to the following rules:
107 The format string is parsed according to the following rules:
109
108
110 1. A dollar sign and a name, possibly followed by any of:
109 1. A dollar sign and a name, possibly followed by any of:
111 - an open-paren, and anything up to the matching paren
110 - an open-paren, and anything up to the matching paren
112 - an open-bracket, and anything up to the matching bracket
111 - an open-bracket, and anything up to the matching bracket
113 - a period and a name
112 - a period and a name
114 any number of times, is evaluated as a Python expression.
113 any number of times, is evaluated as a Python expression.
115
114
116 2. A dollar sign immediately followed by an open-brace, and
115 2. A dollar sign immediately followed by an open-brace, and
117 anything up to the matching close-brace, is evaluated as
116 anything up to the matching close-brace, is evaluated as
118 a Python expression.
117 a Python expression.
119
118
120 3. Outside of the expressions described in the above two rules,
119 3. Outside of the expressions described in the above two rules,
121 two dollar signs in a row give you one literal dollar sign.
120 two dollar signs in a row give you one literal dollar sign.
122
121
123 Optional arguments:
122 Optional arguments:
124
123
125 - codec('utf_8'): a string containing the name of a valid Python
124 - codec('utf_8'): a string containing the name of a valid Python
126 codec.
125 codec.
127
126
128 - encoding_errors('backslashreplace'): a string with a valid error handling
127 - encoding_errors('backslashreplace'): a string with a valid error handling
129 policy. See the codecs module documentation for details.
128 policy. See the codecs module documentation for details.
130
129
131 These are used to encode the format string if a call to str() fails on
130 These are used to encode the format string if a call to str() fails on
132 the expanded result."""
131 the expanded result."""
133
132
134 if not isinstance(format,basestring):
133 if not isinstance(format,basestring):
135 raise TypeError, "needs string initializer"
134 raise TypeError, "needs string initializer"
136 self.format = format
135 self.format = format
137 self.codec = codec
136 self.codec = codec
138 self.encoding_errors = encoding_errors
137 self.encoding_errors = encoding_errors
139
138
140 namechars = "abcdefghijklmnopqrstuvwxyz" \
139 namechars = "abcdefghijklmnopqrstuvwxyz" \
141 "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
140 "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
142 chunks = []
141 chunks = []
143 pos = 0
142 pos = 0
144
143
145 while 1:
144 while 1:
146 dollar = format.find("$", pos)
145 dollar = format.find("$", pos)
147 if dollar < 0: break
146 if dollar < 0: break
148 nextchar = format[dollar+1]
147 nextchar = format[dollar+1]
149
148
150 if nextchar == "{":
149 if nextchar == "{":
151 chunks.append((0, format[pos:dollar]))
150 chunks.append((0, format[pos:dollar]))
152 pos, level = dollar+2, 1
151 pos, level = dollar+2, 1
153 while level:
152 while level:
154 match, pos = matchorfail(format, pos)
153 match, pos = matchorfail(format, pos)
155 tstart, tend = match.regs[3]
154 tstart, tend = match.regs[3]
156 token = format[tstart:tend]
155 token = format[tstart:tend]
157 if token == "{": level = level+1
156 if token == "{": level = level+1
158 elif token == "}": level = level-1
157 elif token == "}": level = level-1
159 chunks.append((1, format[dollar+2:pos-1]))
158 chunks.append((1, format[dollar+2:pos-1]))
160
159
161 elif nextchar in namechars:
160 elif nextchar in namechars:
162 chunks.append((0, format[pos:dollar]))
161 chunks.append((0, format[pos:dollar]))
163 match, pos = matchorfail(format, dollar+1)
162 match, pos = matchorfail(format, dollar+1)
164 while pos < len(format):
163 while pos < len(format):
165 if format[pos] == "." and \
164 if format[pos] == "." and \
166 pos+1 < len(format) and format[pos+1] in namechars:
165 pos+1 < len(format) and format[pos+1] in namechars:
167 match, pos = matchorfail(format, pos+1)
166 match, pos = matchorfail(format, pos+1)
168 elif format[pos] in "([":
167 elif format[pos] in "([":
169 pos, level = pos+1, 1
168 pos, level = pos+1, 1
170 while level:
169 while level:
171 match, pos = matchorfail(format, pos)
170 match, pos = matchorfail(format, pos)
172 tstart, tend = match.regs[3]
171 tstart, tend = match.regs[3]
173 token = format[tstart:tend]
172 token = format[tstart:tend]
174 if token[0] in "([": level = level+1
173 if token[0] in "([": level = level+1
175 elif token[0] in ")]": level = level-1
174 elif token[0] in ")]": level = level-1
176 else: break
175 else: break
177 chunks.append((1, format[dollar+1:pos]))
176 chunks.append((1, format[dollar+1:pos]))
178
177
179 else:
178 else:
180 chunks.append((0, format[pos:dollar+1]))
179 chunks.append((0, format[pos:dollar+1]))
181 pos = dollar + 1 + (nextchar == "$")
180 pos = dollar + 1 + (nextchar == "$")
182
181
183 if pos < len(format): chunks.append((0, format[pos:]))
182 if pos < len(format): chunks.append((0, format[pos:]))
184 self.chunks = chunks
183 self.chunks = chunks
185
184
186 def __repr__(self):
185 def __repr__(self):
187 return "<Itpl %s >" % repr(self.format)
186 return "<Itpl %s >" % repr(self.format)
188
187
189 def _str(self,glob,loc):
188 def _str(self,glob,loc):
190 """Evaluate to a string in the given globals/locals.
189 """Evaluate to a string in the given globals/locals.
191
190
192 The final output is built by calling str(), but if this fails, the
191 The final output is built by calling str(), but if this fails, the
193 result is encoded with the instance's codec and error handling policy,
192 result is encoded with the instance's codec and error handling policy,
194 via a call to out.encode(self.codec,self.encoding_errors)"""
193 via a call to out.encode(self.codec,self.encoding_errors)"""
195 result = []
194 result = []
196 app = result.append
195 app = result.append
197 for live, chunk in self.chunks:
196 for live, chunk in self.chunks:
198 if live: app(str(eval(chunk,glob,loc)))
197 if live: app(str(eval(chunk,glob,loc)))
199 else: app(chunk)
198 else: app(chunk)
200 out = ''.join(result)
199 out = ''.join(result)
201 try:
200 try:
202 return str(out)
201 return str(out)
203 except UnicodeError:
202 except UnicodeError:
204 return out.encode(self.codec,self.encoding_errors)
203 return out.encode(self.codec,self.encoding_errors)
205
204
206 def __str__(self):
205 def __str__(self):
207 """Evaluate and substitute the appropriate parts of the string."""
206 """Evaluate and substitute the appropriate parts of the string."""
208
207
209 # We need to skip enough frames to get to the actual caller outside of
208 # We need to skip enough frames to get to the actual caller outside of
210 # Itpl.
209 # Itpl.
211 frame = sys._getframe(1)
210 frame = sys._getframe(1)
212 while frame.f_globals["__name__"] == __name__: frame = frame.f_back
211 while frame.f_globals["__name__"] == __name__: frame = frame.f_back
213 loc, glob = frame.f_locals, frame.f_globals
212 loc, glob = frame.f_locals, frame.f_globals
214
213
215 return self._str(glob,loc)
214 return self._str(glob,loc)
216
215
217 class ItplNS(Itpl):
216 class ItplNS(Itpl):
218 """Class representing a string with interpolation abilities.
217 """Class representing a string with interpolation abilities.
219
218
220 This inherits from Itpl, but at creation time a namespace is provided
219 This inherits from Itpl, but at creation time a namespace is provided
221 where the evaluation will occur. The interpolation becomes a bit more
220 where the evaluation will occur. The interpolation becomes a bit more
222 efficient, as no traceback needs to be extracte. It also allows the
221 efficient, as no traceback needs to be extracte. It also allows the
223 caller to supply a different namespace for the interpolation to occur than
222 caller to supply a different namespace for the interpolation to occur than
224 its own."""
223 its own."""
225
224
226 def __init__(self, format,globals,locals=None,
225 def __init__(self, format,globals,locals=None,
227 codec='utf_8',encoding_errors='backslashreplace'):
226 codec='utf_8',encoding_errors='backslashreplace'):
228 """ItplNS(format,globals[,locals]) -> interpolating string instance.
227 """ItplNS(format,globals[,locals]) -> interpolating string instance.
229
228
230 This constructor, besides a format string, takes a globals dictionary
229 This constructor, besides a format string, takes a globals dictionary
231 and optionally a locals (which defaults to globals if not provided).
230 and optionally a locals (which defaults to globals if not provided).
232
231
233 For further details, see the Itpl constructor."""
232 For further details, see the Itpl constructor."""
234
233
235 if locals is None:
234 if locals is None:
236 locals = globals
235 locals = globals
237 self.globals = globals
236 self.globals = globals
238 self.locals = locals
237 self.locals = locals
239 Itpl.__init__(self,format,codec,encoding_errors)
238 Itpl.__init__(self,format,codec,encoding_errors)
240
239
241 def __str__(self):
240 def __str__(self):
242 """Evaluate and substitute the appropriate parts of the string."""
241 """Evaluate and substitute the appropriate parts of the string."""
243 return self._str(self.globals,self.locals)
242 return self._str(self.globals,self.locals)
244
243
245 def __repr__(self):
244 def __repr__(self):
246 return "<ItplNS %s >" % repr(self.format)
245 return "<ItplNS %s >" % repr(self.format)
247
246
248 # utilities for fast printing
247 # utilities for fast printing
249 def itpl(text): return str(Itpl(text))
248 def itpl(text): return str(Itpl(text))
250 def printpl(text): print itpl(text)
249 def printpl(text): print itpl(text)
251 # versions with namespace
250 # versions with namespace
252 def itplns(text,globals,locals=None): return str(ItplNS(text,globals,locals))
251 def itplns(text,globals,locals=None): return str(ItplNS(text,globals,locals))
253 def printplns(text,globals,locals=None): print itplns(text,globals,locals)
252 def printplns(text,globals,locals=None): print itplns(text,globals,locals)
254
253
255 class ItplFile:
254 class ItplFile:
256 """A file object that filters each write() through an interpolator."""
255 """A file object that filters each write() through an interpolator."""
257 def __init__(self, file): self.file = file
256 def __init__(self, file): self.file = file
258 def __repr__(self): return "<interpolated " + repr(self.file) + ">"
257 def __repr__(self): return "<interpolated " + repr(self.file) + ">"
259 def __getattr__(self, attr): return getattr(self.file, attr)
258 def __getattr__(self, attr): return getattr(self.file, attr)
260 def write(self, text): self.file.write(str(Itpl(text)))
259 def write(self, text): self.file.write(str(Itpl(text)))
261
260
262 def filter(file=sys.stdout):
261 def filter(file=sys.stdout):
263 """Return an ItplFile that filters writes to the given file object.
262 """Return an ItplFile that filters writes to the given file object.
264
263
265 'file = filter(file)' replaces 'file' with a filtered object that
264 'file = filter(file)' replaces 'file' with a filtered object that
266 has a write() method. When called with no argument, this creates
265 has a write() method. When called with no argument, this creates
267 a filter to sys.stdout."""
266 a filter to sys.stdout."""
268 return ItplFile(file)
267 return ItplFile(file)
269
268
270 def unfilter(ifile=None):
269 def unfilter(ifile=None):
271 """Return the original file that corresponds to the given ItplFile.
270 """Return the original file that corresponds to the given ItplFile.
272
271
273 'file = unfilter(file)' undoes the effect of 'file = filter(file)'.
272 'file = unfilter(file)' undoes the effect of 'file = filter(file)'.
274 'sys.stdout = unfilter()' undoes the effect of 'sys.stdout = filter()'."""
273 'sys.stdout = unfilter()' undoes the effect of 'sys.stdout = filter()'."""
275 return ifile and ifile.file or sys.stdout.file
274 return ifile and ifile.file or sys.stdout.file
@@ -1,1845 +1,1843 b''
1 """Pexpect is a Python module for spawning child applications and controlling
1 """Pexpect is a Python module for spawning child applications and controlling
2 them automatically. Pexpect can be used for automating interactive applications
2 them automatically. Pexpect can be used for automating interactive applications
3 such as ssh, ftp, passwd, telnet, etc. It can be used to a automate setup
3 such as ssh, ftp, passwd, telnet, etc. It can be used to a automate setup
4 scripts for duplicating software package installations on different servers. It
4 scripts for duplicating software package installations on different servers. It
5 can be used for automated software testing. Pexpect is in the spirit of Don
5 can be used for automated software testing. Pexpect is in the spirit of Don
6 Libes' Expect, but Pexpect is pure Python. Other Expect-like modules for Python
6 Libes' Expect, but Pexpect is pure Python. Other Expect-like modules for Python
7 require TCL and Expect or require C extensions to be compiled. Pexpect does not
7 require TCL and Expect or require C extensions to be compiled. Pexpect does not
8 use C, Expect, or TCL extensions. It should work on any platform that supports
8 use C, Expect, or TCL extensions. It should work on any platform that supports
9 the standard Python pty module. The Pexpect interface focuses on ease of use so
9 the standard Python pty module. The Pexpect interface focuses on ease of use so
10 that simple tasks are easy.
10 that simple tasks are easy.
11
11
12 There are two main interfaces to Pexpect -- the function, run() and the class,
12 There are two main interfaces to Pexpect -- the function, run() and the class,
13 spawn. You can call the run() function to execute a command and return the
13 spawn. You can call the run() function to execute a command and return the
14 output. This is a handy replacement for os.system().
14 output. This is a handy replacement for os.system().
15
15
16 For example::
16 For example::
17
17
18 pexpect.run('ls -la')
18 pexpect.run('ls -la')
19
19
20 The more powerful interface is the spawn class. You can use this to spawn an
20 The more powerful interface is the spawn class. You can use this to spawn an
21 external child command and then interact with the child by sending lines and
21 external child command and then interact with the child by sending lines and
22 expecting responses.
22 expecting responses.
23
23
24 For example::
24 For example::
25
25
26 child = pexpect.spawn('scp foo myname@host.example.com:.')
26 child = pexpect.spawn('scp foo myname@host.example.com:.')
27 child.expect ('Password:')
27 child.expect ('Password:')
28 child.sendline (mypassword)
28 child.sendline (mypassword)
29
29
30 This works even for commands that ask for passwords or other input outside of
30 This works even for commands that ask for passwords or other input outside of
31 the normal stdio streams.
31 the normal stdio streams.
32
32
33 Credits: Noah Spurrier, Richard Holden, Marco Molteni, Kimberley Burchett,
33 Credits: Noah Spurrier, Richard Holden, Marco Molteni, Kimberley Burchett,
34 Robert Stone, Hartmut Goebel, Chad Schroeder, Erick Tryzelaar, Dave Kirby, Ids
34 Robert Stone, Hartmut Goebel, Chad Schroeder, Erick Tryzelaar, Dave Kirby, Ids
35 vander Molen, George Todd, Noel Taylor, Nicolas D. Cesar, Alexander Gattin,
35 vander Molen, George Todd, Noel Taylor, Nicolas D. Cesar, Alexander Gattin,
36 Geoffrey Marshall, Francisco Lourenco, Glen Mabey, Karthik Gurusamy, Fernando
36 Geoffrey Marshall, Francisco Lourenco, Glen Mabey, Karthik Gurusamy, Fernando
37 Perez, Corey Minyard, Jon Cohen, Guillaume Chazarain, Andrew Ryan, Nick
37 Perez, Corey Minyard, Jon Cohen, Guillaume Chazarain, Andrew Ryan, Nick
38 Craig-Wood, Andrew Stone, Jorgen Grahn (Let me know if I forgot anyone.)
38 Craig-Wood, Andrew Stone, Jorgen Grahn (Let me know if I forgot anyone.)
39
39
40 Free, open source, and all that good stuff.
40 Free, open source, and all that good stuff.
41
41
42 Permission is hereby granted, free of charge, to any person obtaining a copy of
42 Permission is hereby granted, free of charge, to any person obtaining a copy of
43 this software and associated documentation files (the "Software"), to deal in
43 this software and associated documentation files (the "Software"), to deal in
44 the Software without restriction, including without limitation the rights to
44 the Software without restriction, including without limitation the rights to
45 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
45 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
46 of the Software, and to permit persons to whom the Software is furnished to do
46 of the Software, and to permit persons to whom the Software is furnished to do
47 so, subject to the following conditions:
47 so, subject to the following conditions:
48
48
49 The above copyright notice and this permission notice shall be included in all
49 The above copyright notice and this permission notice shall be included in all
50 copies or substantial portions of the Software.
50 copies or substantial portions of the Software.
51
51
52 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
52 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
53 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
53 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
54 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
54 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
55 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
55 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
56 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
56 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
57 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
57 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
58 SOFTWARE.
58 SOFTWARE.
59
59
60 Pexpect Copyright (c) 2008 Noah Spurrier
60 Pexpect Copyright (c) 2008 Noah Spurrier
61 http://pexpect.sourceforge.net/
61 http://pexpect.sourceforge.net/
62
62
63 $Id: pexpect.py 507 2007-12-27 02:40:52Z noah $
63 $Id: pexpect.py 507 2007-12-27 02:40:52Z noah $
64 """
64 """
65
65
66 try:
66 try:
67 import os, sys, time
67 import os, sys, time
68 import select
68 import select
69 import string
70 import re
69 import re
71 import struct
70 import struct
72 import resource
71 import resource
73 import types
72 import types
74 import pty
73 import pty
75 import tty
74 import tty
76 import termios
75 import termios
77 import fcntl
76 import fcntl
78 import errno
77 import errno
79 import traceback
78 import traceback
80 import signal
79 import signal
81 except ImportError, e:
80 except ImportError, e:
82 raise ImportError (str(e) + """
81 raise ImportError (str(e) + """
83
82
84 A critical module was not found. Probably this operating system does not
83 A critical module was not found. Probably this operating system does not
85 support it. Pexpect is intended for UNIX-like operating systems.""")
84 support it. Pexpect is intended for UNIX-like operating systems.""")
86
85
87 __version__ = '2.3'
86 __version__ = '2.3'
88 __revision__ = '$Revision: 399 $'
87 __revision__ = '$Revision: 399 $'
89 __all__ = ['ExceptionPexpect', 'EOF', 'TIMEOUT', 'spawn', 'run', 'which',
88 __all__ = ['ExceptionPexpect', 'EOF', 'TIMEOUT', 'spawn', 'run', 'which',
90 'split_command_line', '__version__', '__revision__']
89 'split_command_line', '__version__', '__revision__']
91
90
92 # Exception classes used by this module.
91 # Exception classes used by this module.
93 class ExceptionPexpect(Exception):
92 class ExceptionPexpect(Exception):
94
93
95 """Base class for all exceptions raised by this module.
94 """Base class for all exceptions raised by this module.
96 """
95 """
97
96
98 def __init__(self, value):
97 def __init__(self, value):
99
98
100 self.value = value
99 self.value = value
101
100
102 def __str__(self):
101 def __str__(self):
103
102
104 return str(self.value)
103 return str(self.value)
105
104
106 def get_trace(self):
105 def get_trace(self):
107
106
108 """This returns an abbreviated stack trace with lines that only concern
107 """This returns an abbreviated stack trace with lines that only concern
109 the caller. In other words, the stack trace inside the Pexpect module
108 the caller. In other words, the stack trace inside the Pexpect module
110 is not included. """
109 is not included. """
111
110
112 tblist = traceback.extract_tb(sys.exc_info()[2])
111 tblist = traceback.extract_tb(sys.exc_info()[2])
113 #tblist = filter(self.__filter_not_pexpect, tblist)
112 #tblist = filter(self.__filter_not_pexpect, tblist)
114 tblist = [item for item in tblist if self.__filter_not_pexpect(item)]
113 tblist = [item for item in tblist if self.__filter_not_pexpect(item)]
115 tblist = traceback.format_list(tblist)
114 tblist = traceback.format_list(tblist)
116 return ''.join(tblist)
115 return ''.join(tblist)
117
116
118 def __filter_not_pexpect(self, trace_list_item):
117 def __filter_not_pexpect(self, trace_list_item):
119
118
120 """This returns True if list item 0 the string 'pexpect.py' in it. """
119 """This returns True if list item 0 the string 'pexpect.py' in it. """
121
120
122 if trace_list_item[0].find('pexpect.py') == -1:
121 if trace_list_item[0].find('pexpect.py') == -1:
123 return True
122 return True
124 else:
123 else:
125 return False
124 return False
126
125
127 class EOF(ExceptionPexpect):
126 class EOF(ExceptionPexpect):
128
127
129 """Raised when EOF is read from a child. This usually means the child has exited."""
128 """Raised when EOF is read from a child. This usually means the child has exited."""
130
129
131 class TIMEOUT(ExceptionPexpect):
130 class TIMEOUT(ExceptionPexpect):
132
131
133 """Raised when a read time exceeds the timeout. """
132 """Raised when a read time exceeds the timeout. """
134
133
135 ##class TIMEOUT_PATTERN(TIMEOUT):
134 ##class TIMEOUT_PATTERN(TIMEOUT):
136 ## """Raised when the pattern match time exceeds the timeout.
135 ## """Raised when the pattern match time exceeds the timeout.
137 ## This is different than a read TIMEOUT because the child process may
136 ## This is different than a read TIMEOUT because the child process may
138 ## give output, thus never give a TIMEOUT, but the output
137 ## give output, thus never give a TIMEOUT, but the output
139 ## may never match a pattern.
138 ## may never match a pattern.
140 ## """
139 ## """
141 ##class MAXBUFFER(ExceptionPexpect):
140 ##class MAXBUFFER(ExceptionPexpect):
142 ## """Raised when a scan buffer fills before matching an expected pattern."""
141 ## """Raised when a scan buffer fills before matching an expected pattern."""
143
142
144 def run (command, timeout=-1, withexitstatus=False, events=None, extra_args=None, logfile=None, cwd=None, env=None):
143 def run (command, timeout=-1, withexitstatus=False, events=None, extra_args=None, logfile=None, cwd=None, env=None):
145
144
146 """
145 """
147 This function runs the given command; waits for it to finish; then
146 This function runs the given command; waits for it to finish; then
148 returns all output as a string. STDERR is included in output. If the full
147 returns all output as a string. STDERR is included in output. If the full
149 path to the command is not given then the path is searched.
148 path to the command is not given then the path is searched.
150
149
151 Note that lines are terminated by CR/LF (\\r\\n) combination even on
150 Note that lines are terminated by CR/LF (\\r\\n) combination even on
152 UNIX-like systems because this is the standard for pseudo ttys. If you set
151 UNIX-like systems because this is the standard for pseudo ttys. If you set
153 'withexitstatus' to true, then run will return a tuple of (command_output,
152 'withexitstatus' to true, then run will return a tuple of (command_output,
154 exitstatus). If 'withexitstatus' is false then this returns just
153 exitstatus). If 'withexitstatus' is false then this returns just
155 command_output.
154 command_output.
156
155
157 The run() function can often be used instead of creating a spawn instance.
156 The run() function can often be used instead of creating a spawn instance.
158 For example, the following code uses spawn::
157 For example, the following code uses spawn::
159
158
160 from pexpect import *
159 from pexpect import *
161 child = spawn('scp foo myname@host.example.com:.')
160 child = spawn('scp foo myname@host.example.com:.')
162 child.expect ('(?i)password')
161 child.expect ('(?i)password')
163 child.sendline (mypassword)
162 child.sendline (mypassword)
164
163
165 The previous code can be replace with the following::
164 The previous code can be replace with the following::
166
165
167 from pexpect import *
166 from pexpect import *
168 run ('scp foo myname@host.example.com:.', events={'(?i)password': mypassword})
167 run ('scp foo myname@host.example.com:.', events={'(?i)password': mypassword})
169
168
170 Examples
169 Examples
171 ========
170 ========
172
171
173 Start the apache daemon on the local machine::
172 Start the apache daemon on the local machine::
174
173
175 from pexpect import *
174 from pexpect import *
176 run ("/usr/local/apache/bin/apachectl start")
175 run ("/usr/local/apache/bin/apachectl start")
177
176
178 Check in a file using SVN::
177 Check in a file using SVN::
179
178
180 from pexpect import *
179 from pexpect import *
181 run ("svn ci -m 'automatic commit' my_file.py")
180 run ("svn ci -m 'automatic commit' my_file.py")
182
181
183 Run a command and capture exit status::
182 Run a command and capture exit status::
184
183
185 from pexpect import *
184 from pexpect import *
186 (command_output, exitstatus) = run ('ls -l /bin', withexitstatus=1)
185 (command_output, exitstatus) = run ('ls -l /bin', withexitstatus=1)
187
186
188 Tricky Examples
187 Tricky Examples
189 ===============
188 ===============
190
189
191 The following will run SSH and execute 'ls -l' on the remote machine. The
190 The following will run SSH and execute 'ls -l' on the remote machine. The
192 password 'secret' will be sent if the '(?i)password' pattern is ever seen::
191 password 'secret' will be sent if the '(?i)password' pattern is ever seen::
193
192
194 run ("ssh username@machine.example.com 'ls -l'", events={'(?i)password':'secret\\n'})
193 run ("ssh username@machine.example.com 'ls -l'", events={'(?i)password':'secret\\n'})
195
194
196 This will start mencoder to rip a video from DVD. This will also display
195 This will start mencoder to rip a video from DVD. This will also display
197 progress ticks every 5 seconds as it runs. For example::
196 progress ticks every 5 seconds as it runs. For example::
198
197
199 from pexpect import *
198 from pexpect import *
200 def print_ticks(d):
199 def print_ticks(d):
201 print d['event_count'],
200 print d['event_count'],
202 run ("mencoder dvd://1 -o video.avi -oac copy -ovc copy", events={TIMEOUT:print_ticks}, timeout=5)
201 run ("mencoder dvd://1 -o video.avi -oac copy -ovc copy", events={TIMEOUT:print_ticks}, timeout=5)
203
202
204 The 'events' argument should be a dictionary of patterns and responses.
203 The 'events' argument should be a dictionary of patterns and responses.
205 Whenever one of the patterns is seen in the command out run() will send the
204 Whenever one of the patterns is seen in the command out run() will send the
206 associated response string. Note that you should put newlines in your
205 associated response string. Note that you should put newlines in your
207 string if Enter is necessary. The responses may also contain callback
206 string if Enter is necessary. The responses may also contain callback
208 functions. Any callback is function that takes a dictionary as an argument.
207 functions. Any callback is function that takes a dictionary as an argument.
209 The dictionary contains all the locals from the run() function, so you can
208 The dictionary contains all the locals from the run() function, so you can
210 access the child spawn object or any other variable defined in run()
209 access the child spawn object or any other variable defined in run()
211 (event_count, child, and extra_args are the most useful). A callback may
210 (event_count, child, and extra_args are the most useful). A callback may
212 return True to stop the current run process otherwise run() continues until
211 return True to stop the current run process otherwise run() continues until
213 the next event. A callback may also return a string which will be sent to
212 the next event. A callback may also return a string which will be sent to
214 the child. 'extra_args' is not used by directly run(). It provides a way to
213 the child. 'extra_args' is not used by directly run(). It provides a way to
215 pass data to a callback function through run() through the locals
214 pass data to a callback function through run() through the locals
216 dictionary passed to a callback. """
215 dictionary passed to a callback. """
217
216
218 if timeout == -1:
217 if timeout == -1:
219 child = spawn(command, maxread=2000, logfile=logfile, cwd=cwd, env=env)
218 child = spawn(command, maxread=2000, logfile=logfile, cwd=cwd, env=env)
220 else:
219 else:
221 child = spawn(command, timeout=timeout, maxread=2000, logfile=logfile, cwd=cwd, env=env)
220 child = spawn(command, timeout=timeout, maxread=2000, logfile=logfile, cwd=cwd, env=env)
222 if events is not None:
221 if events is not None:
223 patterns = events.keys()
222 patterns = events.keys()
224 responses = events.values()
223 responses = events.values()
225 else:
224 else:
226 patterns=None # We assume that EOF or TIMEOUT will save us.
225 patterns=None # We assume that EOF or TIMEOUT will save us.
227 responses=None
226 responses=None
228 child_result_list = []
227 child_result_list = []
229 event_count = 0
228 event_count = 0
230 while 1:
229 while 1:
231 try:
230 try:
232 index = child.expect (patterns)
231 index = child.expect (patterns)
233 if type(child.after) in types.StringTypes:
232 if type(child.after) in types.StringTypes:
234 child_result_list.append(child.before + child.after)
233 child_result_list.append(child.before + child.after)
235 else: # child.after may have been a TIMEOUT or EOF, so don't cat those.
234 else: # child.after may have been a TIMEOUT or EOF, so don't cat those.
236 child_result_list.append(child.before)
235 child_result_list.append(child.before)
237 if type(responses[index]) in types.StringTypes:
236 if type(responses[index]) in types.StringTypes:
238 child.send(responses[index])
237 child.send(responses[index])
239 elif type(responses[index]) is types.FunctionType:
238 elif type(responses[index]) is types.FunctionType:
240 callback_result = responses[index](locals())
239 callback_result = responses[index](locals())
241 sys.stdout.flush()
240 sys.stdout.flush()
242 if type(callback_result) in types.StringTypes:
241 if type(callback_result) in types.StringTypes:
243 child.send(callback_result)
242 child.send(callback_result)
244 elif callback_result:
243 elif callback_result:
245 break
244 break
246 else:
245 else:
247 raise TypeError ('The callback must be a string or function type.')
246 raise TypeError ('The callback must be a string or function type.')
248 event_count = event_count + 1
247 event_count = event_count + 1
249 except TIMEOUT, e:
248 except TIMEOUT, e:
250 child_result_list.append(child.before)
249 child_result_list.append(child.before)
251 break
250 break
252 except EOF, e:
251 except EOF, e:
253 child_result_list.append(child.before)
252 child_result_list.append(child.before)
254 break
253 break
255 child_result = ''.join(child_result_list)
254 child_result = ''.join(child_result_list)
256 if withexitstatus:
255 if withexitstatus:
257 child.close()
256 child.close()
258 return (child_result, child.exitstatus)
257 return (child_result, child.exitstatus)
259 else:
258 else:
260 return child_result
259 return child_result
261
260
262 class spawn (object):
261 class spawn (object):
263
262
264 """This is the main class interface for Pexpect. Use this class to start
263 """This is the main class interface for Pexpect. Use this class to start
265 and control child applications. """
264 and control child applications. """
266
265
267 def __init__(self, command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None):
266 def __init__(self, command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None):
268
267
269 """This is the constructor. The command parameter may be a string that
268 """This is the constructor. The command parameter may be a string that
270 includes a command and any arguments to the command. For example::
269 includes a command and any arguments to the command. For example::
271
270
272 child = pexpect.spawn ('/usr/bin/ftp')
271 child = pexpect.spawn ('/usr/bin/ftp')
273 child = pexpect.spawn ('/usr/bin/ssh user@example.com')
272 child = pexpect.spawn ('/usr/bin/ssh user@example.com')
274 child = pexpect.spawn ('ls -latr /tmp')
273 child = pexpect.spawn ('ls -latr /tmp')
275
274
276 You may also construct it with a list of arguments like so::
275 You may also construct it with a list of arguments like so::
277
276
278 child = pexpect.spawn ('/usr/bin/ftp', [])
277 child = pexpect.spawn ('/usr/bin/ftp', [])
279 child = pexpect.spawn ('/usr/bin/ssh', ['user@example.com'])
278 child = pexpect.spawn ('/usr/bin/ssh', ['user@example.com'])
280 child = pexpect.spawn ('ls', ['-latr', '/tmp'])
279 child = pexpect.spawn ('ls', ['-latr', '/tmp'])
281
280
282 After this the child application will be created and will be ready to
281 After this the child application will be created and will be ready to
283 talk to. For normal use, see expect() and send() and sendline().
282 talk to. For normal use, see expect() and send() and sendline().
284
283
285 Remember that Pexpect does NOT interpret shell meta characters such as
284 Remember that Pexpect does NOT interpret shell meta characters such as
286 redirect, pipe, or wild cards (>, |, or *). This is a common mistake.
285 redirect, pipe, or wild cards (>, |, or *). This is a common mistake.
287 If you want to run a command and pipe it through another command then
286 If you want to run a command and pipe it through another command then
288 you must also start a shell. For example::
287 you must also start a shell. For example::
289
288
290 child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > log_list.txt"')
289 child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > log_list.txt"')
291 child.expect(pexpect.EOF)
290 child.expect(pexpect.EOF)
292
291
293 The second form of spawn (where you pass a list of arguments) is useful
292 The second form of spawn (where you pass a list of arguments) is useful
294 in situations where you wish to spawn a command and pass it its own
293 in situations where you wish to spawn a command and pass it its own
295 argument list. This can make syntax more clear. For example, the
294 argument list. This can make syntax more clear. For example, the
296 following is equivalent to the previous example::
295 following is equivalent to the previous example::
297
296
298 shell_cmd = 'ls -l | grep LOG > log_list.txt'
297 shell_cmd = 'ls -l | grep LOG > log_list.txt'
299 child = pexpect.spawn('/bin/bash', ['-c', shell_cmd])
298 child = pexpect.spawn('/bin/bash', ['-c', shell_cmd])
300 child.expect(pexpect.EOF)
299 child.expect(pexpect.EOF)
301
300
302 The maxread attribute sets the read buffer size. This is maximum number
301 The maxread attribute sets the read buffer size. This is maximum number
303 of bytes that Pexpect will try to read from a TTY at one time. Setting
302 of bytes that Pexpect will try to read from a TTY at one time. Setting
304 the maxread size to 1 will turn off buffering. Setting the maxread
303 the maxread size to 1 will turn off buffering. Setting the maxread
305 value higher may help performance in cases where large amounts of
304 value higher may help performance in cases where large amounts of
306 output are read back from the child. This feature is useful in
305 output are read back from the child. This feature is useful in
307 conjunction with searchwindowsize.
306 conjunction with searchwindowsize.
308
307
309 The searchwindowsize attribute sets the how far back in the incomming
308 The searchwindowsize attribute sets the how far back in the incomming
310 seach buffer Pexpect will search for pattern matches. Every time
309 seach buffer Pexpect will search for pattern matches. Every time
311 Pexpect reads some data from the child it will append the data to the
310 Pexpect reads some data from the child it will append the data to the
312 incomming buffer. The default is to search from the beginning of the
311 incomming buffer. The default is to search from the beginning of the
313 imcomming buffer each time new data is read from the child. But this is
312 imcomming buffer each time new data is read from the child. But this is
314 very inefficient if you are running a command that generates a large
313 very inefficient if you are running a command that generates a large
315 amount of data where you want to match The searchwindowsize does not
314 amount of data where you want to match The searchwindowsize does not
316 effect the size of the incomming data buffer. You will still have
315 effect the size of the incomming data buffer. You will still have
317 access to the full buffer after expect() returns.
316 access to the full buffer after expect() returns.
318
317
319 The logfile member turns on or off logging. All input and output will
318 The logfile member turns on or off logging. All input and output will
320 be copied to the given file object. Set logfile to None to stop
319 be copied to the given file object. Set logfile to None to stop
321 logging. This is the default. Set logfile to sys.stdout to echo
320 logging. This is the default. Set logfile to sys.stdout to echo
322 everything to standard output. The logfile is flushed after each write.
321 everything to standard output. The logfile is flushed after each write.
323
322
324 Example log input and output to a file::
323 Example log input and output to a file::
325
324
326 child = pexpect.spawn('some_command')
325 child = pexpect.spawn('some_command')
327 fout = file('mylog.txt','w')
326 fout = file('mylog.txt','w')
328 child.logfile = fout
327 child.logfile = fout
329
328
330 Example log to stdout::
329 Example log to stdout::
331
330
332 child = pexpect.spawn('some_command')
331 child = pexpect.spawn('some_command')
333 child.logfile = sys.stdout
332 child.logfile = sys.stdout
334
333
335 The logfile_read and logfile_send members can be used to separately log
334 The logfile_read and logfile_send members can be used to separately log
336 the input from the child and output sent to the child. Sometimes you
335 the input from the child and output sent to the child. Sometimes you
337 don't want to see everything you write to the child. You only want to
336 don't want to see everything you write to the child. You only want to
338 log what the child sends back. For example::
337 log what the child sends back. For example::
339
338
340 child = pexpect.spawn('some_command')
339 child = pexpect.spawn('some_command')
341 child.logfile_read = sys.stdout
340 child.logfile_read = sys.stdout
342
341
343 To separately log output sent to the child use logfile_send::
342 To separately log output sent to the child use logfile_send::
344
343
345 self.logfile_send = fout
344 self.logfile_send = fout
346
345
347 The delaybeforesend helps overcome a weird behavior that many users
346 The delaybeforesend helps overcome a weird behavior that many users
348 were experiencing. The typical problem was that a user would expect() a
347 were experiencing. The typical problem was that a user would expect() a
349 "Password:" prompt and then immediately call sendline() to send the
348 "Password:" prompt and then immediately call sendline() to send the
350 password. The user would then see that their password was echoed back
349 password. The user would then see that their password was echoed back
351 to them. Passwords don't normally echo. The problem is caused by the
350 to them. Passwords don't normally echo. The problem is caused by the
352 fact that most applications print out the "Password" prompt and then
351 fact that most applications print out the "Password" prompt and then
353 turn off stdin echo, but if you send your password before the
352 turn off stdin echo, but if you send your password before the
354 application turned off echo, then you get your password echoed.
353 application turned off echo, then you get your password echoed.
355 Normally this wouldn't be a problem when interacting with a human at a
354 Normally this wouldn't be a problem when interacting with a human at a
356 real keyboard. If you introduce a slight delay just before writing then
355 real keyboard. If you introduce a slight delay just before writing then
357 this seems to clear up the problem. This was such a common problem for
356 this seems to clear up the problem. This was such a common problem for
358 many users that I decided that the default pexpect behavior should be
357 many users that I decided that the default pexpect behavior should be
359 to sleep just before writing to the child application. 1/20th of a
358 to sleep just before writing to the child application. 1/20th of a
360 second (50 ms) seems to be enough to clear up the problem. You can set
359 second (50 ms) seems to be enough to clear up the problem. You can set
361 delaybeforesend to 0 to return to the old behavior. Most Linux machines
360 delaybeforesend to 0 to return to the old behavior. Most Linux machines
362 don't like this to be below 0.03. I don't know why.
361 don't like this to be below 0.03. I don't know why.
363
362
364 Note that spawn is clever about finding commands on your path.
363 Note that spawn is clever about finding commands on your path.
365 It uses the same logic that "which" uses to find executables.
364 It uses the same logic that "which" uses to find executables.
366
365
367 If you wish to get the exit status of the child you must call the
366 If you wish to get the exit status of the child you must call the
368 close() method. The exit or signal status of the child will be stored
367 close() method. The exit or signal status of the child will be stored
369 in self.exitstatus or self.signalstatus. If the child exited normally
368 in self.exitstatus or self.signalstatus. If the child exited normally
370 then exitstatus will store the exit return code and signalstatus will
369 then exitstatus will store the exit return code and signalstatus will
371 be None. If the child was terminated abnormally with a signal then
370 be None. If the child was terminated abnormally with a signal then
372 signalstatus will store the signal value and exitstatus will be None.
371 signalstatus will store the signal value and exitstatus will be None.
373 If you need more detail you can also read the self.status member which
372 If you need more detail you can also read the self.status member which
374 stores the status returned by os.waitpid. You can interpret this using
373 stores the status returned by os.waitpid. You can interpret this using
375 os.WIFEXITED/os.WEXITSTATUS or os.WIFSIGNALED/os.TERMSIG. """
374 os.WIFEXITED/os.WEXITSTATUS or os.WIFSIGNALED/os.TERMSIG. """
376
375
377 self.STDIN_FILENO = pty.STDIN_FILENO
376 self.STDIN_FILENO = pty.STDIN_FILENO
378 self.STDOUT_FILENO = pty.STDOUT_FILENO
377 self.STDOUT_FILENO = pty.STDOUT_FILENO
379 self.STDERR_FILENO = pty.STDERR_FILENO
378 self.STDERR_FILENO = pty.STDERR_FILENO
380 self.stdin = sys.stdin
379 self.stdin = sys.stdin
381 self.stdout = sys.stdout
380 self.stdout = sys.stdout
382 self.stderr = sys.stderr
381 self.stderr = sys.stderr
383
382
384 self.searcher = None
383 self.searcher = None
385 self.ignorecase = False
384 self.ignorecase = False
386 self.before = None
385 self.before = None
387 self.after = None
386 self.after = None
388 self.match = None
387 self.match = None
389 self.match_index = None
388 self.match_index = None
390 self.terminated = True
389 self.terminated = True
391 self.exitstatus = None
390 self.exitstatus = None
392 self.signalstatus = None
391 self.signalstatus = None
393 self.status = None # status returned by os.waitpid
392 self.status = None # status returned by os.waitpid
394 self.flag_eof = False
393 self.flag_eof = False
395 self.pid = None
394 self.pid = None
396 self.child_fd = -1 # initially closed
395 self.child_fd = -1 # initially closed
397 self.timeout = timeout
396 self.timeout = timeout
398 self.delimiter = EOF
397 self.delimiter = EOF
399 self.logfile = logfile
398 self.logfile = logfile
400 self.logfile_read = None # input from child (read_nonblocking)
399 self.logfile_read = None # input from child (read_nonblocking)
401 self.logfile_send = None # output to send (send, sendline)
400 self.logfile_send = None # output to send (send, sendline)
402 self.maxread = maxread # max bytes to read at one time into buffer
401 self.maxread = maxread # max bytes to read at one time into buffer
403 self.buffer = '' # This is the read buffer. See maxread.
402 self.buffer = '' # This is the read buffer. See maxread.
404 self.searchwindowsize = searchwindowsize # Anything before searchwindowsize point is preserved, but not searched.
403 self.searchwindowsize = searchwindowsize # Anything before searchwindowsize point is preserved, but not searched.
405 # Most Linux machines don't like delaybeforesend to be below 0.03 (30 ms).
404 # Most Linux machines don't like delaybeforesend to be below 0.03 (30 ms).
406 self.delaybeforesend = 0.05 # Sets sleep time used just before sending data to child. Time in seconds.
405 self.delaybeforesend = 0.05 # Sets sleep time used just before sending data to child. Time in seconds.
407 self.delayafterclose = 0.1 # Sets delay in close() method to allow kernel time to update process status. Time in seconds.
406 self.delayafterclose = 0.1 # Sets delay in close() method to allow kernel time to update process status. Time in seconds.
408 self.delayafterterminate = 0.1 # Sets delay in terminate() method to allow kernel time to update process status. Time in seconds.
407 self.delayafterterminate = 0.1 # Sets delay in terminate() method to allow kernel time to update process status. Time in seconds.
409 self.softspace = False # File-like object.
408 self.softspace = False # File-like object.
410 self.name = '<' + repr(self) + '>' # File-like object.
409 self.name = '<' + repr(self) + '>' # File-like object.
411 self.encoding = None # File-like object.
410 self.encoding = None # File-like object.
412 self.closed = True # File-like object.
411 self.closed = True # File-like object.
413 self.cwd = cwd
412 self.cwd = cwd
414 self.env = env
413 self.env = env
415 self.__irix_hack = (sys.platform.lower().find('irix')>=0) # This flags if we are running on irix
414 self.__irix_hack = (sys.platform.lower().find('irix')>=0) # This flags if we are running on irix
416 # Solaris uses internal __fork_pty(). All others use pty.fork().
415 # Solaris uses internal __fork_pty(). All others use pty.fork().
417 if (sys.platform.lower().find('solaris')>=0) or (sys.platform.lower().find('sunos5')>=0):
416 if (sys.platform.lower().find('solaris')>=0) or (sys.platform.lower().find('sunos5')>=0):
418 self.use_native_pty_fork = False
417 self.use_native_pty_fork = False
419 else:
418 else:
420 self.use_native_pty_fork = True
419 self.use_native_pty_fork = True
421
420
422
421
423 # allow dummy instances for subclasses that may not use command or args.
422 # allow dummy instances for subclasses that may not use command or args.
424 if command is None:
423 if command is None:
425 self.command = None
424 self.command = None
426 self.args = None
425 self.args = None
427 self.name = '<pexpect factory incomplete>'
426 self.name = '<pexpect factory incomplete>'
428 else:
427 else:
429 self._spawn (command, args)
428 self._spawn (command, args)
430
429
431 def __del__(self):
430 def __del__(self):
432
431
433 """This makes sure that no system resources are left open. Python only
432 """This makes sure that no system resources are left open. Python only
434 garbage collects Python objects. OS file descriptors are not Python
433 garbage collects Python objects. OS file descriptors are not Python
435 objects, so they must be handled explicitly. If the child file
434 objects, so they must be handled explicitly. If the child file
436 descriptor was opened outside of this class (passed to the constructor)
435 descriptor was opened outside of this class (passed to the constructor)
437 then this does not close it. """
436 then this does not close it. """
438
437
439 if not self.closed:
438 if not self.closed:
440 # It is possible for __del__ methods to execute during the
439 # It is possible for __del__ methods to execute during the
441 # teardown of the Python VM itself. Thus self.close() may
440 # teardown of the Python VM itself. Thus self.close() may
442 # trigger an exception because os.close may be None.
441 # trigger an exception because os.close may be None.
443 # -- Fernando Perez
442 # -- Fernando Perez
444 try:
443 try:
445 self.close()
444 self.close()
446 except AttributeError:
445 except AttributeError:
447 pass
446 pass
448
447
449 def __str__(self):
448 def __str__(self):
450
449
451 """This returns a human-readable string that represents the state of
450 """This returns a human-readable string that represents the state of
452 the object. """
451 the object. """
453
452
454 s = []
453 s = []
455 s.append(repr(self))
454 s.append(repr(self))
456 s.append('version: ' + __version__ + ' (' + __revision__ + ')')
455 s.append('version: ' + __version__ + ' (' + __revision__ + ')')
457 s.append('command: ' + str(self.command))
456 s.append('command: ' + str(self.command))
458 s.append('args: ' + str(self.args))
457 s.append('args: ' + str(self.args))
459 s.append('searcher: ' + str(self.searcher))
458 s.append('searcher: ' + str(self.searcher))
460 s.append('buffer (last 100 chars): ' + str(self.buffer)[-100:])
459 s.append('buffer (last 100 chars): ' + str(self.buffer)[-100:])
461 s.append('before (last 100 chars): ' + str(self.before)[-100:])
460 s.append('before (last 100 chars): ' + str(self.before)[-100:])
462 s.append('after: ' + str(self.after))
461 s.append('after: ' + str(self.after))
463 s.append('match: ' + str(self.match))
462 s.append('match: ' + str(self.match))
464 s.append('match_index: ' + str(self.match_index))
463 s.append('match_index: ' + str(self.match_index))
465 s.append('exitstatus: ' + str(self.exitstatus))
464 s.append('exitstatus: ' + str(self.exitstatus))
466 s.append('flag_eof: ' + str(self.flag_eof))
465 s.append('flag_eof: ' + str(self.flag_eof))
467 s.append('pid: ' + str(self.pid))
466 s.append('pid: ' + str(self.pid))
468 s.append('child_fd: ' + str(self.child_fd))
467 s.append('child_fd: ' + str(self.child_fd))
469 s.append('closed: ' + str(self.closed))
468 s.append('closed: ' + str(self.closed))
470 s.append('timeout: ' + str(self.timeout))
469 s.append('timeout: ' + str(self.timeout))
471 s.append('delimiter: ' + str(self.delimiter))
470 s.append('delimiter: ' + str(self.delimiter))
472 s.append('logfile: ' + str(self.logfile))
471 s.append('logfile: ' + str(self.logfile))
473 s.append('logfile_read: ' + str(self.logfile_read))
472 s.append('logfile_read: ' + str(self.logfile_read))
474 s.append('logfile_send: ' + str(self.logfile_send))
473 s.append('logfile_send: ' + str(self.logfile_send))
475 s.append('maxread: ' + str(self.maxread))
474 s.append('maxread: ' + str(self.maxread))
476 s.append('ignorecase: ' + str(self.ignorecase))
475 s.append('ignorecase: ' + str(self.ignorecase))
477 s.append('searchwindowsize: ' + str(self.searchwindowsize))
476 s.append('searchwindowsize: ' + str(self.searchwindowsize))
478 s.append('delaybeforesend: ' + str(self.delaybeforesend))
477 s.append('delaybeforesend: ' + str(self.delaybeforesend))
479 s.append('delayafterclose: ' + str(self.delayafterclose))
478 s.append('delayafterclose: ' + str(self.delayafterclose))
480 s.append('delayafterterminate: ' + str(self.delayafterterminate))
479 s.append('delayafterterminate: ' + str(self.delayafterterminate))
481 return '\n'.join(s)
480 return '\n'.join(s)
482
481
483 def _spawn(self,command,args=[]):
482 def _spawn(self,command,args=[]):
484
483
485 """This starts the given command in a child process. This does all the
484 """This starts the given command in a child process. This does all the
486 fork/exec type of stuff for a pty. This is called by __init__. If args
485 fork/exec type of stuff for a pty. This is called by __init__. If args
487 is empty then command will be parsed (split on spaces) and args will be
486 is empty then command will be parsed (split on spaces) and args will be
488 set to parsed arguments. """
487 set to parsed arguments. """
489
488
490 # The pid and child_fd of this object get set by this method.
489 # The pid and child_fd of this object get set by this method.
491 # Note that it is difficult for this method to fail.
490 # Note that it is difficult for this method to fail.
492 # You cannot detect if the child process cannot start.
491 # You cannot detect if the child process cannot start.
493 # So the only way you can tell if the child process started
492 # So the only way you can tell if the child process started
494 # or not is to try to read from the file descriptor. If you get
493 # or not is to try to read from the file descriptor. If you get
495 # EOF immediately then it means that the child is already dead.
494 # EOF immediately then it means that the child is already dead.
496 # That may not necessarily be bad because you may haved spawned a child
495 # That may not necessarily be bad because you may haved spawned a child
497 # that performs some task; creates no stdout output; and then dies.
496 # that performs some task; creates no stdout output; and then dies.
498
497
499 # If command is an int type then it may represent a file descriptor.
498 # If command is an int type then it may represent a file descriptor.
500 if type(command) == type(0):
499 if type(command) == type(0):
501 raise ExceptionPexpect ('Command is an int type. If this is a file descriptor then maybe you want to use fdpexpect.fdspawn which takes an existing file descriptor instead of a command string.')
500 raise ExceptionPexpect ('Command is an int type. If this is a file descriptor then maybe you want to use fdpexpect.fdspawn which takes an existing file descriptor instead of a command string.')
502
501
503 if type (args) != type([]):
502 if type (args) != type([]):
504 raise TypeError ('The argument, args, must be a list.')
503 raise TypeError ('The argument, args, must be a list.')
505
504
506 if args == []:
505 if args == []:
507 self.args = split_command_line(command)
506 self.args = split_command_line(command)
508 self.command = self.args[0]
507 self.command = self.args[0]
509 else:
508 else:
510 self.args = args[:] # work with a copy
509 self.args = args[:] # work with a copy
511 self.args.insert (0, command)
510 self.args.insert (0, command)
512 self.command = command
511 self.command = command
513
512
514 command_with_path = which(self.command)
513 command_with_path = which(self.command)
515 if command_with_path is None:
514 if command_with_path is None:
516 raise ExceptionPexpect ('The command was not found or was not executable: %s.' % self.command)
515 raise ExceptionPexpect ('The command was not found or was not executable: %s.' % self.command)
517 self.command = command_with_path
516 self.command = command_with_path
518 self.args[0] = self.command
517 self.args[0] = self.command
519
518
520 self.name = '<' + ' '.join (self.args) + '>'
519 self.name = '<' + ' '.join (self.args) + '>'
521
520
522 assert self.pid is None, 'The pid member should be None.'
521 assert self.pid is None, 'The pid member should be None.'
523 assert self.command is not None, 'The command member should not be None.'
522 assert self.command is not None, 'The command member should not be None.'
524
523
525 if self.use_native_pty_fork:
524 if self.use_native_pty_fork:
526 try:
525 try:
527 self.pid, self.child_fd = pty.fork()
526 self.pid, self.child_fd = pty.fork()
528 except OSError, e:
527 except OSError, e:
529 raise ExceptionPexpect('Error! pty.fork() failed: ' + str(e))
528 raise ExceptionPexpect('Error! pty.fork() failed: ' + str(e))
530 else: # Use internal __fork_pty
529 else: # Use internal __fork_pty
531 self.pid, self.child_fd = self.__fork_pty()
530 self.pid, self.child_fd = self.__fork_pty()
532
531
533 if self.pid == 0: # Child
532 if self.pid == 0: # Child
534 try:
533 try:
535 self.child_fd = sys.stdout.fileno() # used by setwinsize()
534 self.child_fd = sys.stdout.fileno() # used by setwinsize()
536 self.setwinsize(24, 80)
535 self.setwinsize(24, 80)
537 except:
536 except:
538 # Some platforms do not like setwinsize (Cygwin).
537 # Some platforms do not like setwinsize (Cygwin).
539 # This will cause problem when running applications that
538 # This will cause problem when running applications that
540 # are very picky about window size.
539 # are very picky about window size.
541 # This is a serious limitation, but not a show stopper.
540 # This is a serious limitation, but not a show stopper.
542 pass
541 pass
543 # Do not allow child to inherit open file descriptors from parent.
542 # Do not allow child to inherit open file descriptors from parent.
544 max_fd = resource.getrlimit(resource.RLIMIT_NOFILE)[0]
543 max_fd = resource.getrlimit(resource.RLIMIT_NOFILE)[0]
545 for i in range (3, max_fd):
544 for i in range (3, max_fd):
546 try:
545 try:
547 os.close (i)
546 os.close (i)
548 except OSError:
547 except OSError:
549 pass
548 pass
550
549
551 # I don't know why this works, but ignoring SIGHUP fixes a
550 # I don't know why this works, but ignoring SIGHUP fixes a
552 # problem when trying to start a Java daemon with sudo
551 # problem when trying to start a Java daemon with sudo
553 # (specifically, Tomcat).
552 # (specifically, Tomcat).
554 signal.signal(signal.SIGHUP, signal.SIG_IGN)
553 signal.signal(signal.SIGHUP, signal.SIG_IGN)
555
554
556 if self.cwd is not None:
555 if self.cwd is not None:
557 os.chdir(self.cwd)
556 os.chdir(self.cwd)
558 if self.env is None:
557 if self.env is None:
559 os.execv(self.command, self.args)
558 os.execv(self.command, self.args)
560 else:
559 else:
561 os.execvpe(self.command, self.args, self.env)
560 os.execvpe(self.command, self.args, self.env)
562
561
563 # Parent
562 # Parent
564 self.terminated = False
563 self.terminated = False
565 self.closed = False
564 self.closed = False
566
565
567 def __fork_pty(self):
566 def __fork_pty(self):
568
567
569 """This implements a substitute for the forkpty system call. This
568 """This implements a substitute for the forkpty system call. This
570 should be more portable than the pty.fork() function. Specifically,
569 should be more portable than the pty.fork() function. Specifically,
571 this should work on Solaris.
570 this should work on Solaris.
572
571
573 Modified 10.06.05 by Geoff Marshall: Implemented __fork_pty() method to
572 Modified 10.06.05 by Geoff Marshall: Implemented __fork_pty() method to
574 resolve the issue with Python's pty.fork() not supporting Solaris,
573 resolve the issue with Python's pty.fork() not supporting Solaris,
575 particularly ssh. Based on patch to posixmodule.c authored by Noah
574 particularly ssh. Based on patch to posixmodule.c authored by Noah
576 Spurrier::
575 Spurrier::
577
576
578 http://mail.python.org/pipermail/python-dev/2003-May/035281.html
577 http://mail.python.org/pipermail/python-dev/2003-May/035281.html
579
578
580 """
579 """
581
580
582 parent_fd, child_fd = os.openpty()
581 parent_fd, child_fd = os.openpty()
583 if parent_fd < 0 or child_fd < 0:
582 if parent_fd < 0 or child_fd < 0:
584 raise ExceptionPexpect, "Error! Could not open pty with os.openpty()."
583 raise ExceptionPexpect, "Error! Could not open pty with os.openpty()."
585
584
586 pid = os.fork()
585 pid = os.fork()
587 if pid < 0:
586 if pid < 0:
588 raise ExceptionPexpect, "Error! Failed os.fork()."
587 raise ExceptionPexpect, "Error! Failed os.fork()."
589 elif pid == 0:
588 elif pid == 0:
590 # Child.
589 # Child.
591 os.close(parent_fd)
590 os.close(parent_fd)
592 self.__pty_make_controlling_tty(child_fd)
591 self.__pty_make_controlling_tty(child_fd)
593
592
594 os.dup2(child_fd, 0)
593 os.dup2(child_fd, 0)
595 os.dup2(child_fd, 1)
594 os.dup2(child_fd, 1)
596 os.dup2(child_fd, 2)
595 os.dup2(child_fd, 2)
597
596
598 if child_fd > 2:
597 if child_fd > 2:
599 os.close(child_fd)
598 os.close(child_fd)
600 else:
599 else:
601 # Parent.
600 # Parent.
602 os.close(child_fd)
601 os.close(child_fd)
603
602
604 return pid, parent_fd
603 return pid, parent_fd
605
604
606 def __pty_make_controlling_tty(self, tty_fd):
605 def __pty_make_controlling_tty(self, tty_fd):
607
606
608 """This makes the pseudo-terminal the controlling tty. This should be
607 """This makes the pseudo-terminal the controlling tty. This should be
609 more portable than the pty.fork() function. Specifically, this should
608 more portable than the pty.fork() function. Specifically, this should
610 work on Solaris. """
609 work on Solaris. """
611
610
612 child_name = os.ttyname(tty_fd)
611 child_name = os.ttyname(tty_fd)
613
612
614 # Disconnect from controlling tty if still connected.
613 # Disconnect from controlling tty if still connected.
615 fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY);
614 fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY);
616 if fd >= 0:
615 if fd >= 0:
617 os.close(fd)
616 os.close(fd)
618
617
619 os.setsid()
618 os.setsid()
620
619
621 # Verify we are disconnected from controlling tty
620 # Verify we are disconnected from controlling tty
622 try:
621 try:
623 fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY);
622 fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY);
624 if fd >= 0:
623 if fd >= 0:
625 os.close(fd)
624 os.close(fd)
626 raise ExceptionPexpect, "Error! We are not disconnected from a controlling tty."
625 raise ExceptionPexpect, "Error! We are not disconnected from a controlling tty."
627 except:
626 except:
628 # Good! We are disconnected from a controlling tty.
627 # Good! We are disconnected from a controlling tty.
629 pass
628 pass
630
629
631 # Verify we can open child pty.
630 # Verify we can open child pty.
632 fd = os.open(child_name, os.O_RDWR);
631 fd = os.open(child_name, os.O_RDWR);
633 if fd < 0:
632 if fd < 0:
634 raise ExceptionPexpect, "Error! Could not open child pty, " + child_name
633 raise ExceptionPexpect, "Error! Could not open child pty, " + child_name
635 else:
634 else:
636 os.close(fd)
635 os.close(fd)
637
636
638 # Verify we now have a controlling tty.
637 # Verify we now have a controlling tty.
639 fd = os.open("/dev/tty", os.O_WRONLY)
638 fd = os.open("/dev/tty", os.O_WRONLY)
640 if fd < 0:
639 if fd < 0:
641 raise ExceptionPexpect, "Error! Could not open controlling tty, /dev/tty"
640 raise ExceptionPexpect, "Error! Could not open controlling tty, /dev/tty"
642 else:
641 else:
643 os.close(fd)
642 os.close(fd)
644
643
645 def fileno (self): # File-like object.
644 def fileno (self): # File-like object.
646
645
647 """This returns the file descriptor of the pty for the child.
646 """This returns the file descriptor of the pty for the child.
648 """
647 """
649
648
650 return self.child_fd
649 return self.child_fd
651
650
652 def close (self, force=True): # File-like object.
651 def close (self, force=True): # File-like object.
653
652
654 """This closes the connection with the child application. Note that
653 """This closes the connection with the child application. Note that
655 calling close() more than once is valid. This emulates standard Python
654 calling close() more than once is valid. This emulates standard Python
656 behavior with files. Set force to True if you want to make sure that
655 behavior with files. Set force to True if you want to make sure that
657 the child is terminated (SIGKILL is sent if the child ignores SIGHUP
656 the child is terminated (SIGKILL is sent if the child ignores SIGHUP
658 and SIGINT). """
657 and SIGINT). """
659
658
660 if not self.closed:
659 if not self.closed:
661 self.flush()
660 self.flush()
662 os.close (self.child_fd)
661 os.close (self.child_fd)
663 time.sleep(self.delayafterclose) # Give kernel time to update process status.
662 time.sleep(self.delayafterclose) # Give kernel time to update process status.
664 if self.isalive():
663 if self.isalive():
665 if not self.terminate(force):
664 if not self.terminate(force):
666 raise ExceptionPexpect ('close() could not terminate the child using terminate()')
665 raise ExceptionPexpect ('close() could not terminate the child using terminate()')
667 self.child_fd = -1
666 self.child_fd = -1
668 self.closed = True
667 self.closed = True
669 #self.pid = None
668 #self.pid = None
670
669
671 def flush (self): # File-like object.
670 def flush (self): # File-like object.
672
671
673 """This does nothing. It is here to support the interface for a
672 """This does nothing. It is here to support the interface for a
674 File-like object. """
673 File-like object. """
675
674
676 pass
675 pass
677
676
678 def isatty (self): # File-like object.
677 def isatty (self): # File-like object.
679
678
680 """This returns True if the file descriptor is open and connected to a
679 """This returns True if the file descriptor is open and connected to a
681 tty(-like) device, else False. """
680 tty(-like) device, else False. """
682
681
683 return os.isatty(self.child_fd)
682 return os.isatty(self.child_fd)
684
683
685 def waitnoecho (self, timeout=-1):
684 def waitnoecho (self, timeout=-1):
686
685
687 """This waits until the terminal ECHO flag is set False. This returns
686 """This waits until the terminal ECHO flag is set False. This returns
688 True if the echo mode is off. This returns False if the ECHO flag was
687 True if the echo mode is off. This returns False if the ECHO flag was
689 not set False before the timeout. This can be used to detect when the
688 not set False before the timeout. This can be used to detect when the
690 child is waiting for a password. Usually a child application will turn
689 child is waiting for a password. Usually a child application will turn
691 off echo mode when it is waiting for the user to enter a password. For
690 off echo mode when it is waiting for the user to enter a password. For
692 example, instead of expecting the "password:" prompt you can wait for
691 example, instead of expecting the "password:" prompt you can wait for
693 the child to set ECHO off::
692 the child to set ECHO off::
694
693
695 p = pexpect.spawn ('ssh user@example.com')
694 p = pexpect.spawn ('ssh user@example.com')
696 p.waitnoecho()
695 p.waitnoecho()
697 p.sendline(mypassword)
696 p.sendline(mypassword)
698
697
699 If timeout is None then this method to block forever until ECHO flag is
698 If timeout is None then this method to block forever until ECHO flag is
700 False.
699 False.
701
700
702 """
701 """
703
702
704 if timeout == -1:
703 if timeout == -1:
705 timeout = self.timeout
704 timeout = self.timeout
706 if timeout is not None:
705 if timeout is not None:
707 end_time = time.time() + timeout
706 end_time = time.time() + timeout
708 while True:
707 while True:
709 if not self.getecho():
708 if not self.getecho():
710 return True
709 return True
711 if timeout < 0 and timeout is not None:
710 if timeout < 0 and timeout is not None:
712 return False
711 return False
713 if timeout is not None:
712 if timeout is not None:
714 timeout = end_time - time.time()
713 timeout = end_time - time.time()
715 time.sleep(0.1)
714 time.sleep(0.1)
716
715
717 def getecho (self):
716 def getecho (self):
718
717
719 """This returns the terminal echo mode. This returns True if echo is
718 """This returns the terminal echo mode. This returns True if echo is
720 on or False if echo is off. Child applications that are expecting you
719 on or False if echo is off. Child applications that are expecting you
721 to enter a password often set ECHO False. See waitnoecho(). """
720 to enter a password often set ECHO False. See waitnoecho(). """
722
721
723 attr = termios.tcgetattr(self.child_fd)
722 attr = termios.tcgetattr(self.child_fd)
724 if attr[3] & termios.ECHO:
723 if attr[3] & termios.ECHO:
725 return True
724 return True
726 return False
725 return False
727
726
728 def setecho (self, state):
727 def setecho (self, state):
729
728
730 """This sets the terminal echo mode on or off. Note that anything the
729 """This sets the terminal echo mode on or off. Note that anything the
731 child sent before the echo will be lost, so you should be sure that
730 child sent before the echo will be lost, so you should be sure that
732 your input buffer is empty before you call setecho(). For example, the
731 your input buffer is empty before you call setecho(). For example, the
733 following will work as expected::
732 following will work as expected::
734
733
735 p = pexpect.spawn('cat')
734 p = pexpect.spawn('cat')
736 p.sendline ('1234') # We will see this twice (once from tty echo and again from cat).
735 p.sendline ('1234') # We will see this twice (once from tty echo and again from cat).
737 p.expect (['1234'])
736 p.expect (['1234'])
738 p.expect (['1234'])
737 p.expect (['1234'])
739 p.setecho(False) # Turn off tty echo
738 p.setecho(False) # Turn off tty echo
740 p.sendline ('abcd') # We will set this only once (echoed by cat).
739 p.sendline ('abcd') # We will set this only once (echoed by cat).
741 p.sendline ('wxyz') # We will set this only once (echoed by cat)
740 p.sendline ('wxyz') # We will set this only once (echoed by cat)
742 p.expect (['abcd'])
741 p.expect (['abcd'])
743 p.expect (['wxyz'])
742 p.expect (['wxyz'])
744
743
745 The following WILL NOT WORK because the lines sent before the setecho
744 The following WILL NOT WORK because the lines sent before the setecho
746 will be lost::
745 will be lost::
747
746
748 p = pexpect.spawn('cat')
747 p = pexpect.spawn('cat')
749 p.sendline ('1234') # We will see this twice (once from tty echo and again from cat).
748 p.sendline ('1234') # We will see this twice (once from tty echo and again from cat).
750 p.setecho(False) # Turn off tty echo
749 p.setecho(False) # Turn off tty echo
751 p.sendline ('abcd') # We will set this only once (echoed by cat).
750 p.sendline ('abcd') # We will set this only once (echoed by cat).
752 p.sendline ('wxyz') # We will set this only once (echoed by cat)
751 p.sendline ('wxyz') # We will set this only once (echoed by cat)
753 p.expect (['1234'])
752 p.expect (['1234'])
754 p.expect (['1234'])
753 p.expect (['1234'])
755 p.expect (['abcd'])
754 p.expect (['abcd'])
756 p.expect (['wxyz'])
755 p.expect (['wxyz'])
757 """
756 """
758
757
759 self.child_fd
758 self.child_fd
760 attr = termios.tcgetattr(self.child_fd)
759 attr = termios.tcgetattr(self.child_fd)
761 if state:
760 if state:
762 attr[3] = attr[3] | termios.ECHO
761 attr[3] = attr[3] | termios.ECHO
763 else:
762 else:
764 attr[3] = attr[3] & ~termios.ECHO
763 attr[3] = attr[3] & ~termios.ECHO
765 # I tried TCSADRAIN and TCSAFLUSH, but these were inconsistent
764 # I tried TCSADRAIN and TCSAFLUSH, but these were inconsistent
766 # and blocked on some platforms. TCSADRAIN is probably ideal if it worked.
765 # and blocked on some platforms. TCSADRAIN is probably ideal if it worked.
767 termios.tcsetattr(self.child_fd, termios.TCSANOW, attr)
766 termios.tcsetattr(self.child_fd, termios.TCSANOW, attr)
768
767
769 def read_nonblocking (self, size = 1, timeout = -1):
768 def read_nonblocking (self, size = 1, timeout = -1):
770
769
771 """This reads at most size characters from the child application. It
770 """This reads at most size characters from the child application. It
772 includes a timeout. If the read does not complete within the timeout
771 includes a timeout. If the read does not complete within the timeout
773 period then a TIMEOUT exception is raised. If the end of file is read
772 period then a TIMEOUT exception is raised. If the end of file is read
774 then an EOF exception will be raised. If a log file was set using
773 then an EOF exception will be raised. If a log file was set using
775 setlog() then all data will also be written to the log file.
774 setlog() then all data will also be written to the log file.
776
775
777 If timeout is None then the read may block indefinitely. If timeout is -1
776 If timeout is None then the read may block indefinitely. If timeout is -1
778 then the self.timeout value is used. If timeout is 0 then the child is
777 then the self.timeout value is used. If timeout is 0 then the child is
779 polled and if there was no data immediately ready then this will raise
778 polled and if there was no data immediately ready then this will raise
780 a TIMEOUT exception.
779 a TIMEOUT exception.
781
780
782 The timeout refers only to the amount of time to read at least one
781 The timeout refers only to the amount of time to read at least one
783 character. This is not effected by the 'size' parameter, so if you call
782 character. This is not effected by the 'size' parameter, so if you call
784 read_nonblocking(size=100, timeout=30) and only one character is
783 read_nonblocking(size=100, timeout=30) and only one character is
785 available right away then one character will be returned immediately.
784 available right away then one character will be returned immediately.
786 It will not wait for 30 seconds for another 99 characters to come in.
785 It will not wait for 30 seconds for another 99 characters to come in.
787
786
788 This is a wrapper around os.read(). It uses select.select() to
787 This is a wrapper around os.read(). It uses select.select() to
789 implement the timeout. """
788 implement the timeout. """
790
789
791 if self.closed:
790 if self.closed:
792 raise ValueError ('I/O operation on closed file in read_nonblocking().')
791 raise ValueError ('I/O operation on closed file in read_nonblocking().')
793
792
794 if timeout == -1:
793 if timeout == -1:
795 timeout = self.timeout
794 timeout = self.timeout
796
795
797 # Note that some systems such as Solaris do not give an EOF when
796 # Note that some systems such as Solaris do not give an EOF when
798 # the child dies. In fact, you can still try to read
797 # the child dies. In fact, you can still try to read
799 # from the child_fd -- it will block forever or until TIMEOUT.
798 # from the child_fd -- it will block forever or until TIMEOUT.
800 # For this case, I test isalive() before doing any reading.
799 # For this case, I test isalive() before doing any reading.
801 # If isalive() is false, then I pretend that this is the same as EOF.
800 # If isalive() is false, then I pretend that this is the same as EOF.
802 if not self.isalive():
801 if not self.isalive():
803 r,w,e = self.__select([self.child_fd], [], [], 0) # timeout of 0 means "poll"
802 r,w,e = self.__select([self.child_fd], [], [], 0) # timeout of 0 means "poll"
804 if not r:
803 if not r:
805 self.flag_eof = True
804 self.flag_eof = True
806 raise EOF ('End Of File (EOF) in read_nonblocking(). Braindead platform.')
805 raise EOF ('End Of File (EOF) in read_nonblocking(). Braindead platform.')
807 elif self.__irix_hack:
806 elif self.__irix_hack:
808 # This is a hack for Irix. It seems that Irix requires a long delay before checking isalive.
807 # This is a hack for Irix. It seems that Irix requires a long delay before checking isalive.
809 # This adds a 2 second delay, but only when the child is terminated.
808 # This adds a 2 second delay, but only when the child is terminated.
810 r, w, e = self.__select([self.child_fd], [], [], 2)
809 r, w, e = self.__select([self.child_fd], [], [], 2)
811 if not r and not self.isalive():
810 if not r and not self.isalive():
812 self.flag_eof = True
811 self.flag_eof = True
813 raise EOF ('End Of File (EOF) in read_nonblocking(). Pokey platform.')
812 raise EOF ('End Of File (EOF) in read_nonblocking(). Pokey platform.')
814
813
815 r,w,e = self.__select([self.child_fd], [], [], timeout)
814 r,w,e = self.__select([self.child_fd], [], [], timeout)
816
815
817 if not r:
816 if not r:
818 if not self.isalive():
817 if not self.isalive():
819 # Some platforms, such as Irix, will claim that their processes are alive;
818 # Some platforms, such as Irix, will claim that their processes are alive;
820 # then timeout on the select; and then finally admit that they are not alive.
819 # then timeout on the select; and then finally admit that they are not alive.
821 self.flag_eof = True
820 self.flag_eof = True
822 raise EOF ('End of File (EOF) in read_nonblocking(). Very pokey platform.')
821 raise EOF ('End of File (EOF) in read_nonblocking(). Very pokey platform.')
823 else:
822 else:
824 raise TIMEOUT ('Timeout exceeded in read_nonblocking().')
823 raise TIMEOUT ('Timeout exceeded in read_nonblocking().')
825
824
826 if self.child_fd in r:
825 if self.child_fd in r:
827 try:
826 try:
828 s = os.read(self.child_fd, size)
827 s = os.read(self.child_fd, size)
829 except OSError, e: # Linux does this
828 except OSError, e: # Linux does this
830 self.flag_eof = True
829 self.flag_eof = True
831 raise EOF ('End Of File (EOF) in read_nonblocking(). Exception style platform.')
830 raise EOF ('End Of File (EOF) in read_nonblocking(). Exception style platform.')
832 if s == '': # BSD style
831 if s == '': # BSD style
833 self.flag_eof = True
832 self.flag_eof = True
834 raise EOF ('End Of File (EOF) in read_nonblocking(). Empty string style platform.')
833 raise EOF ('End Of File (EOF) in read_nonblocking(). Empty string style platform.')
835
834
836 if self.logfile is not None:
835 if self.logfile is not None:
837 self.logfile.write (s)
836 self.logfile.write (s)
838 self.logfile.flush()
837 self.logfile.flush()
839 if self.logfile_read is not None:
838 if self.logfile_read is not None:
840 self.logfile_read.write (s)
839 self.logfile_read.write (s)
841 self.logfile_read.flush()
840 self.logfile_read.flush()
842
841
843 return s
842 return s
844
843
845 raise ExceptionPexpect ('Reached an unexpected state in read_nonblocking().')
844 raise ExceptionPexpect ('Reached an unexpected state in read_nonblocking().')
846
845
847 def read (self, size = -1): # File-like object.
846 def read (self, size = -1): # File-like object.
848
847
849 """This reads at most "size" bytes from the file (less if the read hits
848 """This reads at most "size" bytes from the file (less if the read hits
850 EOF before obtaining size bytes). If the size argument is negative or
849 EOF before obtaining size bytes). If the size argument is negative or
851 omitted, read all data until EOF is reached. The bytes are returned as
850 omitted, read all data until EOF is reached. The bytes are returned as
852 a string object. An empty string is returned when EOF is encountered
851 a string object. An empty string is returned when EOF is encountered
853 immediately. """
852 immediately. """
854
853
855 if size == 0:
854 if size == 0:
856 return ''
855 return ''
857 if size < 0:
856 if size < 0:
858 self.expect (self.delimiter) # delimiter default is EOF
857 self.expect (self.delimiter) # delimiter default is EOF
859 return self.before
858 return self.before
860
859
861 # I could have done this more directly by not using expect(), but
860 # I could have done this more directly by not using expect(), but
862 # I deliberately decided to couple read() to expect() so that
861 # I deliberately decided to couple read() to expect() so that
863 # I would catch any bugs early and ensure consistant behavior.
862 # I would catch any bugs early and ensure consistant behavior.
864 # It's a little less efficient, but there is less for me to
863 # It's a little less efficient, but there is less for me to
865 # worry about if I have to later modify read() or expect().
864 # worry about if I have to later modify read() or expect().
866 # Note, it's OK if size==-1 in the regex. That just means it
865 # Note, it's OK if size==-1 in the regex. That just means it
867 # will never match anything in which case we stop only on EOF.
866 # will never match anything in which case we stop only on EOF.
868 cre = re.compile('.{%d}' % size, re.DOTALL)
867 cre = re.compile('.{%d}' % size, re.DOTALL)
869 index = self.expect ([cre, self.delimiter]) # delimiter default is EOF
868 index = self.expect ([cre, self.delimiter]) # delimiter default is EOF
870 if index == 0:
869 if index == 0:
871 return self.after ### self.before should be ''. Should I assert this?
870 return self.after ### self.before should be ''. Should I assert this?
872 return self.before
871 return self.before
873
872
874 def readline (self, size = -1): # File-like object.
873 def readline (self, size = -1): # File-like object.
875
874
876 """This reads and returns one entire line. A trailing newline is kept
875 """This reads and returns one entire line. A trailing newline is kept
877 in the string, but may be absent when a file ends with an incomplete
876 in the string, but may be absent when a file ends with an incomplete
878 line. Note: This readline() looks for a \\r\\n pair even on UNIX
877 line. Note: This readline() looks for a \\r\\n pair even on UNIX
879 because this is what the pseudo tty device returns. So contrary to what
878 because this is what the pseudo tty device returns. So contrary to what
880 you may expect you will receive the newline as \\r\\n. An empty string
879 you may expect you will receive the newline as \\r\\n. An empty string
881 is returned when EOF is hit immediately. Currently, the size argument is
880 is returned when EOF is hit immediately. Currently, the size argument is
882 mostly ignored, so this behavior is not standard for a file-like
881 mostly ignored, so this behavior is not standard for a file-like
883 object. If size is 0 then an empty string is returned. """
882 object. If size is 0 then an empty string is returned. """
884
883
885 if size == 0:
884 if size == 0:
886 return ''
885 return ''
887 index = self.expect (['\r\n', self.delimiter]) # delimiter default is EOF
886 index = self.expect (['\r\n', self.delimiter]) # delimiter default is EOF
888 if index == 0:
887 if index == 0:
889 return self.before + '\r\n'
888 return self.before + '\r\n'
890 else:
889 else:
891 return self.before
890 return self.before
892
891
893 def __iter__ (self): # File-like object.
892 def __iter__ (self): # File-like object.
894
893
895 """This is to support iterators over a file-like object.
894 """This is to support iterators over a file-like object.
896 """
895 """
897
896
898 return self
897 return self
899
898
900 def next (self): # File-like object.
899 def next (self): # File-like object.
901
900
902 """This is to support iterators over a file-like object.
901 """This is to support iterators over a file-like object.
903 """
902 """
904
903
905 result = self.readline()
904 result = self.readline()
906 if result == "":
905 if result == "":
907 raise StopIteration
906 raise StopIteration
908 return result
907 return result
909
908
910 def readlines (self, sizehint = -1): # File-like object.
909 def readlines (self, sizehint = -1): # File-like object.
911
910
912 """This reads until EOF using readline() and returns a list containing
911 """This reads until EOF using readline() and returns a list containing
913 the lines thus read. The optional "sizehint" argument is ignored. """
912 the lines thus read. The optional "sizehint" argument is ignored. """
914
913
915 lines = []
914 lines = []
916 while True:
915 while True:
917 line = self.readline()
916 line = self.readline()
918 if not line:
917 if not line:
919 break
918 break
920 lines.append(line)
919 lines.append(line)
921 return lines
920 return lines
922
921
923 def write(self, s): # File-like object.
922 def write(self, s): # File-like object.
924
923
925 """This is similar to send() except that there is no return value.
924 """This is similar to send() except that there is no return value.
926 """
925 """
927
926
928 self.send (s)
927 self.send (s)
929
928
930 def writelines (self, sequence): # File-like object.
929 def writelines (self, sequence): # File-like object.
931
930
932 """This calls write() for each element in the sequence. The sequence
931 """This calls write() for each element in the sequence. The sequence
933 can be any iterable object producing strings, typically a list of
932 can be any iterable object producing strings, typically a list of
934 strings. This does not add line separators There is no return value.
933 strings. This does not add line separators There is no return value.
935 """
934 """
936
935
937 for s in sequence:
936 for s in sequence:
938 self.write (s)
937 self.write (s)
939
938
940 def send(self, s):
939 def send(self, s):
941
940
942 """This sends a string to the child process. This returns the number of
941 """This sends a string to the child process. This returns the number of
943 bytes written. If a log file was set then the data is also written to
942 bytes written. If a log file was set then the data is also written to
944 the log. """
943 the log. """
945
944
946 time.sleep(self.delaybeforesend)
945 time.sleep(self.delaybeforesend)
947 if self.logfile is not None:
946 if self.logfile is not None:
948 self.logfile.write (s)
947 self.logfile.write (s)
949 self.logfile.flush()
948 self.logfile.flush()
950 if self.logfile_send is not None:
949 if self.logfile_send is not None:
951 self.logfile_send.write (s)
950 self.logfile_send.write (s)
952 self.logfile_send.flush()
951 self.logfile_send.flush()
953 c = os.write(self.child_fd, s)
952 c = os.write(self.child_fd, s)
954 return c
953 return c
955
954
956 def sendline(self, s=''):
955 def sendline(self, s=''):
957
956
958 """This is like send(), but it adds a line feed (os.linesep). This
957 """This is like send(), but it adds a line feed (os.linesep). This
959 returns the number of bytes written. """
958 returns the number of bytes written. """
960
959
961 n = self.send(s)
960 n = self.send(s)
962 n = n + self.send (os.linesep)
961 n = n + self.send (os.linesep)
963 return n
962 return n
964
963
965 def sendcontrol(self, char):
964 def sendcontrol(self, char):
966
965
967 """This sends a control character to the child such as Ctrl-C or
966 """This sends a control character to the child such as Ctrl-C or
968 Ctrl-D. For example, to send a Ctrl-G (ASCII 7)::
967 Ctrl-D. For example, to send a Ctrl-G (ASCII 7)::
969
968
970 child.sendcontrol('g')
969 child.sendcontrol('g')
971
970
972 See also, sendintr() and sendeof().
971 See also, sendintr() and sendeof().
973 """
972 """
974
973
975 char = char.lower()
974 char = char.lower()
976 a = ord(char)
975 a = ord(char)
977 if a>=97 and a<=122:
976 if a>=97 and a<=122:
978 a = a - ord('a') + 1
977 a = a - ord('a') + 1
979 return self.send (chr(a))
978 return self.send (chr(a))
980 d = {'@':0, '`':0,
979 d = {'@':0, '`':0,
981 '[':27, '{':27,
980 '[':27, '{':27,
982 '\\':28, '|':28,
981 '\\':28, '|':28,
983 ']':29, '}': 29,
982 ']':29, '}': 29,
984 '^':30, '~':30,
983 '^':30, '~':30,
985 '_':31,
984 '_':31,
986 '?':127}
985 '?':127}
987 if char not in d:
986 if char not in d:
988 return 0
987 return 0
989 return self.send (chr(d[char]))
988 return self.send (chr(d[char]))
990
989
991 def sendeof(self):
990 def sendeof(self):
992
991
993 """This sends an EOF to the child. This sends a character which causes
992 """This sends an EOF to the child. This sends a character which causes
994 the pending parent output buffer to be sent to the waiting child
993 the pending parent output buffer to be sent to the waiting child
995 program without waiting for end-of-line. If it is the first character
994 program without waiting for end-of-line. If it is the first character
996 of the line, the read() in the user program returns 0, which signifies
995 of the line, the read() in the user program returns 0, which signifies
997 end-of-file. This means to work as expected a sendeof() has to be
996 end-of-file. This means to work as expected a sendeof() has to be
998 called at the beginning of a line. This method does not send a newline.
997 called at the beginning of a line. This method does not send a newline.
999 It is the responsibility of the caller to ensure the eof is sent at the
998 It is the responsibility of the caller to ensure the eof is sent at the
1000 beginning of a line. """
999 beginning of a line. """
1001
1000
1002 ### Hmmm... how do I send an EOF?
1001 ### Hmmm... how do I send an EOF?
1003 ###C if ((m = write(pty, *buf, p - *buf)) < 0)
1002 ###C if ((m = write(pty, *buf, p - *buf)) < 0)
1004 ###C return (errno == EWOULDBLOCK) ? n : -1;
1003 ###C return (errno == EWOULDBLOCK) ? n : -1;
1005 #fd = sys.stdin.fileno()
1004 #fd = sys.stdin.fileno()
1006 #old = termios.tcgetattr(fd) # remember current state
1005 #old = termios.tcgetattr(fd) # remember current state
1007 #attr = termios.tcgetattr(fd)
1006 #attr = termios.tcgetattr(fd)
1008 #attr[3] = attr[3] | termios.ICANON # ICANON must be set to recognize EOF
1007 #attr[3] = attr[3] | termios.ICANON # ICANON must be set to recognize EOF
1009 #try: # use try/finally to ensure state gets restored
1008 #try: # use try/finally to ensure state gets restored
1010 # termios.tcsetattr(fd, termios.TCSADRAIN, attr)
1009 # termios.tcsetattr(fd, termios.TCSADRAIN, attr)
1011 # if hasattr(termios, 'CEOF'):
1010 # if hasattr(termios, 'CEOF'):
1012 # os.write (self.child_fd, '%c' % termios.CEOF)
1011 # os.write (self.child_fd, '%c' % termios.CEOF)
1013 # else:
1012 # else:
1014 # # Silly platform does not define CEOF so assume CTRL-D
1013 # # Silly platform does not define CEOF so assume CTRL-D
1015 # os.write (self.child_fd, '%c' % 4)
1014 # os.write (self.child_fd, '%c' % 4)
1016 #finally: # restore state
1015 #finally: # restore state
1017 # termios.tcsetattr(fd, termios.TCSADRAIN, old)
1016 # termios.tcsetattr(fd, termios.TCSADRAIN, old)
1018 if hasattr(termios, 'VEOF'):
1017 if hasattr(termios, 'VEOF'):
1019 char = termios.tcgetattr(self.child_fd)[6][termios.VEOF]
1018 char = termios.tcgetattr(self.child_fd)[6][termios.VEOF]
1020 else:
1019 else:
1021 # platform does not define VEOF so assume CTRL-D
1020 # platform does not define VEOF so assume CTRL-D
1022 char = chr(4)
1021 char = chr(4)
1023 self.send(char)
1022 self.send(char)
1024
1023
1025 def sendintr(self):
1024 def sendintr(self):
1026
1025
1027 """This sends a SIGINT to the child. It does not require
1026 """This sends a SIGINT to the child. It does not require
1028 the SIGINT to be the first character on a line. """
1027 the SIGINT to be the first character on a line. """
1029
1028
1030 if hasattr(termios, 'VINTR'):
1029 if hasattr(termios, 'VINTR'):
1031 char = termios.tcgetattr(self.child_fd)[6][termios.VINTR]
1030 char = termios.tcgetattr(self.child_fd)[6][termios.VINTR]
1032 else:
1031 else:
1033 # platform does not define VINTR so assume CTRL-C
1032 # platform does not define VINTR so assume CTRL-C
1034 char = chr(3)
1033 char = chr(3)
1035 self.send (char)
1034 self.send (char)
1036
1035
1037 def eof (self):
1036 def eof (self):
1038
1037
1039 """This returns True if the EOF exception was ever raised.
1038 """This returns True if the EOF exception was ever raised.
1040 """
1039 """
1041
1040
1042 return self.flag_eof
1041 return self.flag_eof
1043
1042
1044 def terminate(self, force=False):
1043 def terminate(self, force=False):
1045
1044
1046 """This forces a child process to terminate. It starts nicely with
1045 """This forces a child process to terminate. It starts nicely with
1047 SIGHUP and SIGINT. If "force" is True then moves onto SIGKILL. This
1046 SIGHUP and SIGINT. If "force" is True then moves onto SIGKILL. This
1048 returns True if the child was terminated. This returns False if the
1047 returns True if the child was terminated. This returns False if the
1049 child could not be terminated. """
1048 child could not be terminated. """
1050
1049
1051 if not self.isalive():
1050 if not self.isalive():
1052 return True
1051 return True
1053 try:
1052 try:
1054 self.kill(signal.SIGHUP)
1053 self.kill(signal.SIGHUP)
1055 time.sleep(self.delayafterterminate)
1054 time.sleep(self.delayafterterminate)
1056 if not self.isalive():
1055 if not self.isalive():
1057 return True
1056 return True
1058 self.kill(signal.SIGCONT)
1057 self.kill(signal.SIGCONT)
1059 time.sleep(self.delayafterterminate)
1058 time.sleep(self.delayafterterminate)
1060 if not self.isalive():
1059 if not self.isalive():
1061 return True
1060 return True
1062 self.kill(signal.SIGINT)
1061 self.kill(signal.SIGINT)
1063 time.sleep(self.delayafterterminate)
1062 time.sleep(self.delayafterterminate)
1064 if not self.isalive():
1063 if not self.isalive():
1065 return True
1064 return True
1066 if force:
1065 if force:
1067 self.kill(signal.SIGKILL)
1066 self.kill(signal.SIGKILL)
1068 time.sleep(self.delayafterterminate)
1067 time.sleep(self.delayafterterminate)
1069 if not self.isalive():
1068 if not self.isalive():
1070 return True
1069 return True
1071 else:
1070 else:
1072 return False
1071 return False
1073 return False
1072 return False
1074 except OSError, e:
1073 except OSError, e:
1075 # I think there are kernel timing issues that sometimes cause
1074 # I think there are kernel timing issues that sometimes cause
1076 # this to happen. I think isalive() reports True, but the
1075 # this to happen. I think isalive() reports True, but the
1077 # process is dead to the kernel.
1076 # process is dead to the kernel.
1078 # Make one last attempt to see if the kernel is up to date.
1077 # Make one last attempt to see if the kernel is up to date.
1079 time.sleep(self.delayafterterminate)
1078 time.sleep(self.delayafterterminate)
1080 if not self.isalive():
1079 if not self.isalive():
1081 return True
1080 return True
1082 else:
1081 else:
1083 return False
1082 return False
1084
1083
1085 def wait(self):
1084 def wait(self):
1086
1085
1087 """This waits until the child exits. This is a blocking call. This will
1086 """This waits until the child exits. This is a blocking call. This will
1088 not read any data from the child, so this will block forever if the
1087 not read any data from the child, so this will block forever if the
1089 child has unread output and has terminated. In other words, the child
1088 child has unread output and has terminated. In other words, the child
1090 may have printed output then called exit(); but, technically, the child
1089 may have printed output then called exit(); but, technically, the child
1091 is still alive until its output is read. """
1090 is still alive until its output is read. """
1092
1091
1093 if self.isalive():
1092 if self.isalive():
1094 pid, status = os.waitpid(self.pid, 0)
1093 pid, status = os.waitpid(self.pid, 0)
1095 else:
1094 else:
1096 raise ExceptionPexpect ('Cannot wait for dead child process.')
1095 raise ExceptionPexpect ('Cannot wait for dead child process.')
1097 self.exitstatus = os.WEXITSTATUS(status)
1096 self.exitstatus = os.WEXITSTATUS(status)
1098 if os.WIFEXITED (status):
1097 if os.WIFEXITED (status):
1099 self.status = status
1098 self.status = status
1100 self.exitstatus = os.WEXITSTATUS(status)
1099 self.exitstatus = os.WEXITSTATUS(status)
1101 self.signalstatus = None
1100 self.signalstatus = None
1102 self.terminated = True
1101 self.terminated = True
1103 elif os.WIFSIGNALED (status):
1102 elif os.WIFSIGNALED (status):
1104 self.status = status
1103 self.status = status
1105 self.exitstatus = None
1104 self.exitstatus = None
1106 self.signalstatus = os.WTERMSIG(status)
1105 self.signalstatus = os.WTERMSIG(status)
1107 self.terminated = True
1106 self.terminated = True
1108 elif os.WIFSTOPPED (status):
1107 elif os.WIFSTOPPED (status):
1109 raise ExceptionPexpect ('Wait was called for a child process that is stopped. This is not supported. Is some other process attempting job control with our child pid?')
1108 raise ExceptionPexpect ('Wait was called for a child process that is stopped. This is not supported. Is some other process attempting job control with our child pid?')
1110 return self.exitstatus
1109 return self.exitstatus
1111
1110
1112 def isalive(self):
1111 def isalive(self):
1113
1112
1114 """This tests if the child process is running or not. This is
1113 """This tests if the child process is running or not. This is
1115 non-blocking. If the child was terminated then this will read the
1114 non-blocking. If the child was terminated then this will read the
1116 exitstatus or signalstatus of the child. This returns True if the child
1115 exitstatus or signalstatus of the child. This returns True if the child
1117 process appears to be running or False if not. It can take literally
1116 process appears to be running or False if not. It can take literally
1118 SECONDS for Solaris to return the right status. """
1117 SECONDS for Solaris to return the right status. """
1119
1118
1120 if self.terminated:
1119 if self.terminated:
1121 return False
1120 return False
1122
1121
1123 if self.flag_eof:
1122 if self.flag_eof:
1124 # This is for Linux, which requires the blocking form of waitpid to get
1123 # This is for Linux, which requires the blocking form of waitpid to get
1125 # status of a defunct process. This is super-lame. The flag_eof would have
1124 # status of a defunct process. This is super-lame. The flag_eof would have
1126 # been set in read_nonblocking(), so this should be safe.
1125 # been set in read_nonblocking(), so this should be safe.
1127 waitpid_options = 0
1126 waitpid_options = 0
1128 else:
1127 else:
1129 waitpid_options = os.WNOHANG
1128 waitpid_options = os.WNOHANG
1130
1129
1131 try:
1130 try:
1132 pid, status = os.waitpid(self.pid, waitpid_options)
1131 pid, status = os.waitpid(self.pid, waitpid_options)
1133 except OSError, e: # No child processes
1132 except OSError, e: # No child processes
1134 if e[0] == errno.ECHILD:
1133 if e[0] == errno.ECHILD:
1135 raise ExceptionPexpect ('isalive() encountered condition where "terminated" is 0, but there was no child process. Did someone else call waitpid() on our process?')
1134 raise ExceptionPexpect ('isalive() encountered condition where "terminated" is 0, but there was no child process. Did someone else call waitpid() on our process?')
1136 else:
1135 else:
1137 raise e
1136 raise e
1138
1137
1139 # I have to do this twice for Solaris. I can't even believe that I figured this out...
1138 # I have to do this twice for Solaris. I can't even believe that I figured this out...
1140 # If waitpid() returns 0 it means that no child process wishes to
1139 # If waitpid() returns 0 it means that no child process wishes to
1141 # report, and the value of status is undefined.
1140 # report, and the value of status is undefined.
1142 if pid == 0:
1141 if pid == 0:
1143 try:
1142 try:
1144 pid, status = os.waitpid(self.pid, waitpid_options) ### os.WNOHANG) # Solaris!
1143 pid, status = os.waitpid(self.pid, waitpid_options) ### os.WNOHANG) # Solaris!
1145 except OSError, e: # This should never happen...
1144 except OSError, e: # This should never happen...
1146 if e[0] == errno.ECHILD:
1145 if e[0] == errno.ECHILD:
1147 raise ExceptionPexpect ('isalive() encountered condition that should never happen. There was no child process. Did someone else call waitpid() on our process?')
1146 raise ExceptionPexpect ('isalive() encountered condition that should never happen. There was no child process. Did someone else call waitpid() on our process?')
1148 else:
1147 else:
1149 raise e
1148 raise e
1150
1149
1151 # If pid is still 0 after two calls to waitpid() then
1150 # If pid is still 0 after two calls to waitpid() then
1152 # the process really is alive. This seems to work on all platforms, except
1151 # the process really is alive. This seems to work on all platforms, except
1153 # for Irix which seems to require a blocking call on waitpid or select, so I let read_nonblocking
1152 # for Irix which seems to require a blocking call on waitpid or select, so I let read_nonblocking
1154 # take care of this situation (unfortunately, this requires waiting through the timeout).
1153 # take care of this situation (unfortunately, this requires waiting through the timeout).
1155 if pid == 0:
1154 if pid == 0:
1156 return True
1155 return True
1157
1156
1158 if pid == 0:
1157 if pid == 0:
1159 return True
1158 return True
1160
1159
1161 if os.WIFEXITED (status):
1160 if os.WIFEXITED (status):
1162 self.status = status
1161 self.status = status
1163 self.exitstatus = os.WEXITSTATUS(status)
1162 self.exitstatus = os.WEXITSTATUS(status)
1164 self.signalstatus = None
1163 self.signalstatus = None
1165 self.terminated = True
1164 self.terminated = True
1166 elif os.WIFSIGNALED (status):
1165 elif os.WIFSIGNALED (status):
1167 self.status = status
1166 self.status = status
1168 self.exitstatus = None
1167 self.exitstatus = None
1169 self.signalstatus = os.WTERMSIG(status)
1168 self.signalstatus = os.WTERMSIG(status)
1170 self.terminated = True
1169 self.terminated = True
1171 elif os.WIFSTOPPED (status):
1170 elif os.WIFSTOPPED (status):
1172 raise ExceptionPexpect ('isalive() encountered condition where child process is stopped. This is not supported. Is some other process attempting job control with our child pid?')
1171 raise ExceptionPexpect ('isalive() encountered condition where child process is stopped. This is not supported. Is some other process attempting job control with our child pid?')
1173 return False
1172 return False
1174
1173
1175 def kill(self, sig):
1174 def kill(self, sig):
1176
1175
1177 """This sends the given signal to the child application. In keeping
1176 """This sends the given signal to the child application. In keeping
1178 with UNIX tradition it has a misleading name. It does not necessarily
1177 with UNIX tradition it has a misleading name. It does not necessarily
1179 kill the child unless you send the right signal. """
1178 kill the child unless you send the right signal. """
1180
1179
1181 # Same as os.kill, but the pid is given for you.
1180 # Same as os.kill, but the pid is given for you.
1182 if self.isalive():
1181 if self.isalive():
1183 os.kill(self.pid, sig)
1182 os.kill(self.pid, sig)
1184
1183
1185 def compile_pattern_list(self, patterns):
1184 def compile_pattern_list(self, patterns):
1186
1185
1187 """This compiles a pattern-string or a list of pattern-strings.
1186 """This compiles a pattern-string or a list of pattern-strings.
1188 Patterns must be a StringType, EOF, TIMEOUT, SRE_Pattern, or a list of
1187 Patterns must be a StringType, EOF, TIMEOUT, SRE_Pattern, or a list of
1189 those. Patterns may also be None which results in an empty list (you
1188 those. Patterns may also be None which results in an empty list (you
1190 might do this if waiting for an EOF or TIMEOUT condition without
1189 might do this if waiting for an EOF or TIMEOUT condition without
1191 expecting any pattern).
1190 expecting any pattern).
1192
1191
1193 This is used by expect() when calling expect_list(). Thus expect() is
1192 This is used by expect() when calling expect_list(). Thus expect() is
1194 nothing more than::
1193 nothing more than::
1195
1194
1196 cpl = self.compile_pattern_list(pl)
1195 cpl = self.compile_pattern_list(pl)
1197 return self.expect_list(cpl, timeout)
1196 return self.expect_list(cpl, timeout)
1198
1197
1199 If you are using expect() within a loop it may be more
1198 If you are using expect() within a loop it may be more
1200 efficient to compile the patterns first and then call expect_list().
1199 efficient to compile the patterns first and then call expect_list().
1201 This avoid calls in a loop to compile_pattern_list()::
1200 This avoid calls in a loop to compile_pattern_list()::
1202
1201
1203 cpl = self.compile_pattern_list(my_pattern)
1202 cpl = self.compile_pattern_list(my_pattern)
1204 while some_condition:
1203 while some_condition:
1205 ...
1204 ...
1206 i = self.expect_list(clp, timeout)
1205 i = self.expect_list(clp, timeout)
1207 ...
1206 ...
1208 """
1207 """
1209
1208
1210 if patterns is None:
1209 if patterns is None:
1211 return []
1210 return []
1212 if type(patterns) is not types.ListType:
1211 if type(patterns) is not types.ListType:
1213 patterns = [patterns]
1212 patterns = [patterns]
1214
1213
1215 compile_flags = re.DOTALL # Allow dot to match \n
1214 compile_flags = re.DOTALL # Allow dot to match \n
1216 if self.ignorecase:
1215 if self.ignorecase:
1217 compile_flags = compile_flags | re.IGNORECASE
1216 compile_flags = compile_flags | re.IGNORECASE
1218 compiled_pattern_list = []
1217 compiled_pattern_list = []
1219 for p in patterns:
1218 for p in patterns:
1220 if type(p) in types.StringTypes:
1219 if type(p) in types.StringTypes:
1221 compiled_pattern_list.append(re.compile(p, compile_flags))
1220 compiled_pattern_list.append(re.compile(p, compile_flags))
1222 elif p is EOF:
1221 elif p is EOF:
1223 compiled_pattern_list.append(EOF)
1222 compiled_pattern_list.append(EOF)
1224 elif p is TIMEOUT:
1223 elif p is TIMEOUT:
1225 compiled_pattern_list.append(TIMEOUT)
1224 compiled_pattern_list.append(TIMEOUT)
1226 elif type(p) is type(re.compile('')):
1225 elif type(p) is type(re.compile('')):
1227 compiled_pattern_list.append(p)
1226 compiled_pattern_list.append(p)
1228 else:
1227 else:
1229 raise TypeError ('Argument must be one of StringTypes, EOF, TIMEOUT, SRE_Pattern, or a list of those type. %s' % str(type(p)))
1228 raise TypeError ('Argument must be one of StringTypes, EOF, TIMEOUT, SRE_Pattern, or a list of those type. %s' % str(type(p)))
1230
1229
1231 return compiled_pattern_list
1230 return compiled_pattern_list
1232
1231
1233 def expect(self, pattern, timeout = -1, searchwindowsize=None):
1232 def expect(self, pattern, timeout = -1, searchwindowsize=None):
1234
1233
1235 """This seeks through the stream until a pattern is matched. The
1234 """This seeks through the stream until a pattern is matched. The
1236 pattern is overloaded and may take several types. The pattern can be a
1235 pattern is overloaded and may take several types. The pattern can be a
1237 StringType, EOF, a compiled re, or a list of any of those types.
1236 StringType, EOF, a compiled re, or a list of any of those types.
1238 Strings will be compiled to re types. This returns the index into the
1237 Strings will be compiled to re types. This returns the index into the
1239 pattern list. If the pattern was not a list this returns index 0 on a
1238 pattern list. If the pattern was not a list this returns index 0 on a
1240 successful match. This may raise exceptions for EOF or TIMEOUT. To
1239 successful match. This may raise exceptions for EOF or TIMEOUT. To
1241 avoid the EOF or TIMEOUT exceptions add EOF or TIMEOUT to the pattern
1240 avoid the EOF or TIMEOUT exceptions add EOF or TIMEOUT to the pattern
1242 list. That will cause expect to match an EOF or TIMEOUT condition
1241 list. That will cause expect to match an EOF or TIMEOUT condition
1243 instead of raising an exception.
1242 instead of raising an exception.
1244
1243
1245 If you pass a list of patterns and more than one matches, the first match
1244 If you pass a list of patterns and more than one matches, the first match
1246 in the stream is chosen. If more than one pattern matches at that point,
1245 in the stream is chosen. If more than one pattern matches at that point,
1247 the leftmost in the pattern list is chosen. For example::
1246 the leftmost in the pattern list is chosen. For example::
1248
1247
1249 # the input is 'foobar'
1248 # the input is 'foobar'
1250 index = p.expect (['bar', 'foo', 'foobar'])
1249 index = p.expect (['bar', 'foo', 'foobar'])
1251 # returns 1 ('foo') even though 'foobar' is a "better" match
1250 # returns 1 ('foo') even though 'foobar' is a "better" match
1252
1251
1253 Please note, however, that buffering can affect this behavior, since
1252 Please note, however, that buffering can affect this behavior, since
1254 input arrives in unpredictable chunks. For example::
1253 input arrives in unpredictable chunks. For example::
1255
1254
1256 # the input is 'foobar'
1255 # the input is 'foobar'
1257 index = p.expect (['foobar', 'foo'])
1256 index = p.expect (['foobar', 'foo'])
1258 # returns 0 ('foobar') if all input is available at once,
1257 # returns 0 ('foobar') if all input is available at once,
1259 # but returs 1 ('foo') if parts of the final 'bar' arrive late
1258 # but returs 1 ('foo') if parts of the final 'bar' arrive late
1260
1259
1261 After a match is found the instance attributes 'before', 'after' and
1260 After a match is found the instance attributes 'before', 'after' and
1262 'match' will be set. You can see all the data read before the match in
1261 'match' will be set. You can see all the data read before the match in
1263 'before'. You can see the data that was matched in 'after'. The
1262 'before'. You can see the data that was matched in 'after'. The
1264 re.MatchObject used in the re match will be in 'match'. If an error
1263 re.MatchObject used in the re match will be in 'match'. If an error
1265 occurred then 'before' will be set to all the data read so far and
1264 occurred then 'before' will be set to all the data read so far and
1266 'after' and 'match' will be None.
1265 'after' and 'match' will be None.
1267
1266
1268 If timeout is -1 then timeout will be set to the self.timeout value.
1267 If timeout is -1 then timeout will be set to the self.timeout value.
1269
1268
1270 A list entry may be EOF or TIMEOUT instead of a string. This will
1269 A list entry may be EOF or TIMEOUT instead of a string. This will
1271 catch these exceptions and return the index of the list entry instead
1270 catch these exceptions and return the index of the list entry instead
1272 of raising the exception. The attribute 'after' will be set to the
1271 of raising the exception. The attribute 'after' will be set to the
1273 exception type. The attribute 'match' will be None. This allows you to
1272 exception type. The attribute 'match' will be None. This allows you to
1274 write code like this::
1273 write code like this::
1275
1274
1276 index = p.expect (['good', 'bad', pexpect.EOF, pexpect.TIMEOUT])
1275 index = p.expect (['good', 'bad', pexpect.EOF, pexpect.TIMEOUT])
1277 if index == 0:
1276 if index == 0:
1278 do_something()
1277 do_something()
1279 elif index == 1:
1278 elif index == 1:
1280 do_something_else()
1279 do_something_else()
1281 elif index == 2:
1280 elif index == 2:
1282 do_some_other_thing()
1281 do_some_other_thing()
1283 elif index == 3:
1282 elif index == 3:
1284 do_something_completely_different()
1283 do_something_completely_different()
1285
1284
1286 instead of code like this::
1285 instead of code like this::
1287
1286
1288 try:
1287 try:
1289 index = p.expect (['good', 'bad'])
1288 index = p.expect (['good', 'bad'])
1290 if index == 0:
1289 if index == 0:
1291 do_something()
1290 do_something()
1292 elif index == 1:
1291 elif index == 1:
1293 do_something_else()
1292 do_something_else()
1294 except EOF:
1293 except EOF:
1295 do_some_other_thing()
1294 do_some_other_thing()
1296 except TIMEOUT:
1295 except TIMEOUT:
1297 do_something_completely_different()
1296 do_something_completely_different()
1298
1297
1299 These two forms are equivalent. It all depends on what you want. You
1298 These two forms are equivalent. It all depends on what you want. You
1300 can also just expect the EOF if you are waiting for all output of a
1299 can also just expect the EOF if you are waiting for all output of a
1301 child to finish. For example::
1300 child to finish. For example::
1302
1301
1303 p = pexpect.spawn('/bin/ls')
1302 p = pexpect.spawn('/bin/ls')
1304 p.expect (pexpect.EOF)
1303 p.expect (pexpect.EOF)
1305 print p.before
1304 print p.before
1306
1305
1307 If you are trying to optimize for speed then see expect_list().
1306 If you are trying to optimize for speed then see expect_list().
1308 """
1307 """
1309
1308
1310 compiled_pattern_list = self.compile_pattern_list(pattern)
1309 compiled_pattern_list = self.compile_pattern_list(pattern)
1311 return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
1310 return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
1312
1311
1313 def expect_list(self, pattern_list, timeout = -1, searchwindowsize = -1):
1312 def expect_list(self, pattern_list, timeout = -1, searchwindowsize = -1):
1314
1313
1315 """This takes a list of compiled regular expressions and returns the
1314 """This takes a list of compiled regular expressions and returns the
1316 index into the pattern_list that matched the child output. The list may
1315 index into the pattern_list that matched the child output. The list may
1317 also contain EOF or TIMEOUT (which are not compiled regular
1316 also contain EOF or TIMEOUT (which are not compiled regular
1318 expressions). This method is similar to the expect() method except that
1317 expressions). This method is similar to the expect() method except that
1319 expect_list() does not recompile the pattern list on every call. This
1318 expect_list() does not recompile the pattern list on every call. This
1320 may help if you are trying to optimize for speed, otherwise just use
1319 may help if you are trying to optimize for speed, otherwise just use
1321 the expect() method. This is called by expect(). If timeout==-1 then
1320 the expect() method. This is called by expect(). If timeout==-1 then
1322 the self.timeout value is used. If searchwindowsize==-1 then the
1321 the self.timeout value is used. If searchwindowsize==-1 then the
1323 self.searchwindowsize value is used. """
1322 self.searchwindowsize value is used. """
1324
1323
1325 return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize)
1324 return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize)
1326
1325
1327 def expect_exact(self, pattern_list, timeout = -1, searchwindowsize = -1):
1326 def expect_exact(self, pattern_list, timeout = -1, searchwindowsize = -1):
1328
1327
1329 """This is similar to expect(), but uses plain string matching instead
1328 """This is similar to expect(), but uses plain string matching instead
1330 of compiled regular expressions in 'pattern_list'. The 'pattern_list'
1329 of compiled regular expressions in 'pattern_list'. The 'pattern_list'
1331 may be a string; a list or other sequence of strings; or TIMEOUT and
1330 may be a string; a list or other sequence of strings; or TIMEOUT and
1332 EOF.
1331 EOF.
1333
1332
1334 This call might be faster than expect() for two reasons: string
1333 This call might be faster than expect() for two reasons: string
1335 searching is faster than RE matching and it is possible to limit the
1334 searching is faster than RE matching and it is possible to limit the
1336 search to just the end of the input buffer.
1335 search to just the end of the input buffer.
1337
1336
1338 This method is also useful when you don't want to have to worry about
1337 This method is also useful when you don't want to have to worry about
1339 escaping regular expression characters that you want to match."""
1338 escaping regular expression characters that you want to match."""
1340
1339
1341 if type(pattern_list) in types.StringTypes or pattern_list in (TIMEOUT, EOF):
1340 if type(pattern_list) in types.StringTypes or pattern_list in (TIMEOUT, EOF):
1342 pattern_list = [pattern_list]
1341 pattern_list = [pattern_list]
1343 return self.expect_loop(searcher_string(pattern_list), timeout, searchwindowsize)
1342 return self.expect_loop(searcher_string(pattern_list), timeout, searchwindowsize)
1344
1343
1345 def expect_loop(self, searcher, timeout = -1, searchwindowsize = -1):
1344 def expect_loop(self, searcher, timeout = -1, searchwindowsize = -1):
1346
1345
1347 """This is the common loop used inside expect. The 'searcher' should be
1346 """This is the common loop used inside expect. The 'searcher' should be
1348 an instance of searcher_re or searcher_string, which describes how and what
1347 an instance of searcher_re or searcher_string, which describes how and what
1349 to search for in the input.
1348 to search for in the input.
1350
1349
1351 See expect() for other arguments, return value and exceptions. """
1350 See expect() for other arguments, return value and exceptions. """
1352
1351
1353 self.searcher = searcher
1352 self.searcher = searcher
1354
1353
1355 if timeout == -1:
1354 if timeout == -1:
1356 timeout = self.timeout
1355 timeout = self.timeout
1357 if timeout is not None:
1356 if timeout is not None:
1358 end_time = time.time() + timeout
1357 end_time = time.time() + timeout
1359 if searchwindowsize == -1:
1358 if searchwindowsize == -1:
1360 searchwindowsize = self.searchwindowsize
1359 searchwindowsize = self.searchwindowsize
1361
1360
1362 try:
1361 try:
1363 incoming = self.buffer
1362 incoming = self.buffer
1364 freshlen = len(incoming)
1363 freshlen = len(incoming)
1365 while True: # Keep reading until exception or return.
1364 while True: # Keep reading until exception or return.
1366 index = searcher.search(incoming, freshlen, searchwindowsize)
1365 index = searcher.search(incoming, freshlen, searchwindowsize)
1367 if index >= 0:
1366 if index >= 0:
1368 self.buffer = incoming[searcher.end : ]
1367 self.buffer = incoming[searcher.end : ]
1369 self.before = incoming[ : searcher.start]
1368 self.before = incoming[ : searcher.start]
1370 self.after = incoming[searcher.start : searcher.end]
1369 self.after = incoming[searcher.start : searcher.end]
1371 self.match = searcher.match
1370 self.match = searcher.match
1372 self.match_index = index
1371 self.match_index = index
1373 return self.match_index
1372 return self.match_index
1374 # No match at this point
1373 # No match at this point
1375 if timeout < 0 and timeout is not None:
1374 if timeout < 0 and timeout is not None:
1376 raise TIMEOUT ('Timeout exceeded in expect_any().')
1375 raise TIMEOUT ('Timeout exceeded in expect_any().')
1377 # Still have time left, so read more data
1376 # Still have time left, so read more data
1378 c = self.read_nonblocking (self.maxread, timeout)
1377 c = self.read_nonblocking (self.maxread, timeout)
1379 freshlen = len(c)
1378 freshlen = len(c)
1380 time.sleep (0.0001)
1379 time.sleep (0.0001)
1381 incoming = incoming + c
1380 incoming = incoming + c
1382 if timeout is not None:
1381 if timeout is not None:
1383 timeout = end_time - time.time()
1382 timeout = end_time - time.time()
1384 except EOF, e:
1383 except EOF, e:
1385 self.buffer = ''
1384 self.buffer = ''
1386 self.before = incoming
1385 self.before = incoming
1387 self.after = EOF
1386 self.after = EOF
1388 index = searcher.eof_index
1387 index = searcher.eof_index
1389 if index >= 0:
1388 if index >= 0:
1390 self.match = EOF
1389 self.match = EOF
1391 self.match_index = index
1390 self.match_index = index
1392 return self.match_index
1391 return self.match_index
1393 else:
1392 else:
1394 self.match = None
1393 self.match = None
1395 self.match_index = None
1394 self.match_index = None
1396 raise EOF (str(e) + '\n' + str(self))
1395 raise EOF (str(e) + '\n' + str(self))
1397 except TIMEOUT, e:
1396 except TIMEOUT, e:
1398 self.buffer = incoming
1397 self.buffer = incoming
1399 self.before = incoming
1398 self.before = incoming
1400 self.after = TIMEOUT
1399 self.after = TIMEOUT
1401 index = searcher.timeout_index
1400 index = searcher.timeout_index
1402 if index >= 0:
1401 if index >= 0:
1403 self.match = TIMEOUT
1402 self.match = TIMEOUT
1404 self.match_index = index
1403 self.match_index = index
1405 return self.match_index
1404 return self.match_index
1406 else:
1405 else:
1407 self.match = None
1406 self.match = None
1408 self.match_index = None
1407 self.match_index = None
1409 raise TIMEOUT (str(e) + '\n' + str(self))
1408 raise TIMEOUT (str(e) + '\n' + str(self))
1410 except:
1409 except:
1411 self.before = incoming
1410 self.before = incoming
1412 self.after = None
1411 self.after = None
1413 self.match = None
1412 self.match = None
1414 self.match_index = None
1413 self.match_index = None
1415 raise
1414 raise
1416
1415
1417 def getwinsize(self):
1416 def getwinsize(self):
1418
1417
1419 """This returns the terminal window size of the child tty. The return
1418 """This returns the terminal window size of the child tty. The return
1420 value is a tuple of (rows, cols). """
1419 value is a tuple of (rows, cols). """
1421
1420
1422 TIOCGWINSZ = getattr(termios, 'TIOCGWINSZ', 1074295912L)
1421 TIOCGWINSZ = getattr(termios, 'TIOCGWINSZ', 1074295912L)
1423 s = struct.pack('HHHH', 0, 0, 0, 0)
1422 s = struct.pack('HHHH', 0, 0, 0, 0)
1424 x = fcntl.ioctl(self.fileno(), TIOCGWINSZ, s)
1423 x = fcntl.ioctl(self.fileno(), TIOCGWINSZ, s)
1425 return struct.unpack('HHHH', x)[0:2]
1424 return struct.unpack('HHHH', x)[0:2]
1426
1425
1427 def setwinsize(self, r, c):
1426 def setwinsize(self, r, c):
1428
1427
1429 """This sets the terminal window size of the child tty. This will cause
1428 """This sets the terminal window size of the child tty. This will cause
1430 a SIGWINCH signal to be sent to the child. This does not change the
1429 a SIGWINCH signal to be sent to the child. This does not change the
1431 physical window size. It changes the size reported to TTY-aware
1430 physical window size. It changes the size reported to TTY-aware
1432 applications like vi or curses -- applications that respond to the
1431 applications like vi or curses -- applications that respond to the
1433 SIGWINCH signal. """
1432 SIGWINCH signal. """
1434
1433
1435 # Check for buggy platforms. Some Python versions on some platforms
1434 # Check for buggy platforms. Some Python versions on some platforms
1436 # (notably OSF1 Alpha and RedHat 7.1) truncate the value for
1435 # (notably OSF1 Alpha and RedHat 7.1) truncate the value for
1437 # termios.TIOCSWINSZ. It is not clear why this happens.
1436 # termios.TIOCSWINSZ. It is not clear why this happens.
1438 # These platforms don't seem to handle the signed int very well;
1437 # These platforms don't seem to handle the signed int very well;
1439 # yet other platforms like OpenBSD have a large negative value for
1438 # yet other platforms like OpenBSD have a large negative value for
1440 # TIOCSWINSZ and they don't have a truncate problem.
1439 # TIOCSWINSZ and they don't have a truncate problem.
1441 # Newer versions of Linux have totally different values for TIOCSWINSZ.
1440 # Newer versions of Linux have totally different values for TIOCSWINSZ.
1442 # Note that this fix is a hack.
1441 # Note that this fix is a hack.
1443 TIOCSWINSZ = getattr(termios, 'TIOCSWINSZ', -2146929561)
1442 TIOCSWINSZ = getattr(termios, 'TIOCSWINSZ', -2146929561)
1444 if TIOCSWINSZ == 2148037735L: # L is not required in Python >= 2.2.
1443 if TIOCSWINSZ == 2148037735L: # L is not required in Python >= 2.2.
1445 TIOCSWINSZ = -2146929561 # Same bits, but with sign.
1444 TIOCSWINSZ = -2146929561 # Same bits, but with sign.
1446 # Note, assume ws_xpixel and ws_ypixel are zero.
1445 # Note, assume ws_xpixel and ws_ypixel are zero.
1447 s = struct.pack('HHHH', r, c, 0, 0)
1446 s = struct.pack('HHHH', r, c, 0, 0)
1448 fcntl.ioctl(self.fileno(), TIOCSWINSZ, s)
1447 fcntl.ioctl(self.fileno(), TIOCSWINSZ, s)
1449
1448
1450 def interact(self, escape_character = chr(29), input_filter = None, output_filter = None):
1449 def interact(self, escape_character = chr(29), input_filter = None, output_filter = None):
1451
1450
1452 """This gives control of the child process to the interactive user (the
1451 """This gives control of the child process to the interactive user (the
1453 human at the keyboard). Keystrokes are sent to the child process, and
1452 human at the keyboard). Keystrokes are sent to the child process, and
1454 the stdout and stderr output of the child process is printed. This
1453 the stdout and stderr output of the child process is printed. This
1455 simply echos the child stdout and child stderr to the real stdout and
1454 simply echos the child stdout and child stderr to the real stdout and
1456 it echos the real stdin to the child stdin. When the user types the
1455 it echos the real stdin to the child stdin. When the user types the
1457 escape_character this method will stop. The default for
1456 escape_character this method will stop. The default for
1458 escape_character is ^]. This should not be confused with ASCII 27 --
1457 escape_character is ^]. This should not be confused with ASCII 27 --
1459 the ESC character. ASCII 29 was chosen for historical merit because
1458 the ESC character. ASCII 29 was chosen for historical merit because
1460 this is the character used by 'telnet' as the escape character. The
1459 this is the character used by 'telnet' as the escape character. The
1461 escape_character will not be sent to the child process.
1460 escape_character will not be sent to the child process.
1462
1461
1463 You may pass in optional input and output filter functions. These
1462 You may pass in optional input and output filter functions. These
1464 functions should take a string and return a string. The output_filter
1463 functions should take a string and return a string. The output_filter
1465 will be passed all the output from the child process. The input_filter
1464 will be passed all the output from the child process. The input_filter
1466 will be passed all the keyboard input from the user. The input_filter
1465 will be passed all the keyboard input from the user. The input_filter
1467 is run BEFORE the check for the escape_character.
1466 is run BEFORE the check for the escape_character.
1468
1467
1469 Note that if you change the window size of the parent the SIGWINCH
1468 Note that if you change the window size of the parent the SIGWINCH
1470 signal will not be passed through to the child. If you want the child
1469 signal will not be passed through to the child. If you want the child
1471 window size to change when the parent's window size changes then do
1470 window size to change when the parent's window size changes then do
1472 something like the following example::
1471 something like the following example::
1473
1472
1474 import pexpect, struct, fcntl, termios, signal, sys
1473 import pexpect, struct, fcntl, termios, signal, sys
1475 def sigwinch_passthrough (sig, data):
1474 def sigwinch_passthrough (sig, data):
1476 s = struct.pack("HHHH", 0, 0, 0, 0)
1475 s = struct.pack("HHHH", 0, 0, 0, 0)
1477 a = struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ , s))
1476 a = struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ , s))
1478 global p
1477 global p
1479 p.setwinsize(a[0],a[1])
1478 p.setwinsize(a[0],a[1])
1480 p = pexpect.spawn('/bin/bash') # Note this is global and used in sigwinch_passthrough.
1479 p = pexpect.spawn('/bin/bash') # Note this is global and used in sigwinch_passthrough.
1481 signal.signal(signal.SIGWINCH, sigwinch_passthrough)
1480 signal.signal(signal.SIGWINCH, sigwinch_passthrough)
1482 p.interact()
1481 p.interact()
1483 """
1482 """
1484
1483
1485 # Flush the buffer.
1484 # Flush the buffer.
1486 self.stdout.write (self.buffer)
1485 self.stdout.write (self.buffer)
1487 self.stdout.flush()
1486 self.stdout.flush()
1488 self.buffer = ''
1487 self.buffer = ''
1489 mode = tty.tcgetattr(self.STDIN_FILENO)
1488 mode = tty.tcgetattr(self.STDIN_FILENO)
1490 tty.setraw(self.STDIN_FILENO)
1489 tty.setraw(self.STDIN_FILENO)
1491 try:
1490 try:
1492 self.__interact_copy(escape_character, input_filter, output_filter)
1491 self.__interact_copy(escape_character, input_filter, output_filter)
1493 finally:
1492 finally:
1494 tty.tcsetattr(self.STDIN_FILENO, tty.TCSAFLUSH, mode)
1493 tty.tcsetattr(self.STDIN_FILENO, tty.TCSAFLUSH, mode)
1495
1494
1496 def __interact_writen(self, fd, data):
1495 def __interact_writen(self, fd, data):
1497
1496
1498 """This is used by the interact() method.
1497 """This is used by the interact() method.
1499 """
1498 """
1500
1499
1501 while data != '' and self.isalive():
1500 while data != '' and self.isalive():
1502 n = os.write(fd, data)
1501 n = os.write(fd, data)
1503 data = data[n:]
1502 data = data[n:]
1504
1503
1505 def __interact_read(self, fd):
1504 def __interact_read(self, fd):
1506
1505
1507 """This is used by the interact() method.
1506 """This is used by the interact() method.
1508 """
1507 """
1509
1508
1510 return os.read(fd, 1000)
1509 return os.read(fd, 1000)
1511
1510
1512 def __interact_copy(self, escape_character = None, input_filter = None, output_filter = None):
1511 def __interact_copy(self, escape_character = None, input_filter = None, output_filter = None):
1513
1512
1514 """This is used by the interact() method.
1513 """This is used by the interact() method.
1515 """
1514 """
1516
1515
1517 while self.isalive():
1516 while self.isalive():
1518 r,w,e = self.__select([self.child_fd, self.STDIN_FILENO], [], [])
1517 r,w,e = self.__select([self.child_fd, self.STDIN_FILENO], [], [])
1519 if self.child_fd in r:
1518 if self.child_fd in r:
1520 data = self.__interact_read(self.child_fd)
1519 data = self.__interact_read(self.child_fd)
1521 if output_filter: data = output_filter(data)
1520 if output_filter: data = output_filter(data)
1522 if self.logfile is not None:
1521 if self.logfile is not None:
1523 self.logfile.write (data)
1522 self.logfile.write (data)
1524 self.logfile.flush()
1523 self.logfile.flush()
1525 os.write(self.STDOUT_FILENO, data)
1524 os.write(self.STDOUT_FILENO, data)
1526 if self.STDIN_FILENO in r:
1525 if self.STDIN_FILENO in r:
1527 data = self.__interact_read(self.STDIN_FILENO)
1526 data = self.__interact_read(self.STDIN_FILENO)
1528 if input_filter: data = input_filter(data)
1527 if input_filter: data = input_filter(data)
1529 i = data.rfind(escape_character)
1528 i = data.rfind(escape_character)
1530 if i != -1:
1529 if i != -1:
1531 data = data[:i]
1530 data = data[:i]
1532 self.__interact_writen(self.child_fd, data)
1531 self.__interact_writen(self.child_fd, data)
1533 break
1532 break
1534 self.__interact_writen(self.child_fd, data)
1533 self.__interact_writen(self.child_fd, data)
1535
1534
1536 def __select (self, iwtd, owtd, ewtd, timeout=None):
1535 def __select (self, iwtd, owtd, ewtd, timeout=None):
1537
1536
1538 """This is a wrapper around select.select() that ignores signals. If
1537 """This is a wrapper around select.select() that ignores signals. If
1539 select.select raises a select.error exception and errno is an EINTR
1538 select.select raises a select.error exception and errno is an EINTR
1540 error then it is ignored. Mainly this is used to ignore sigwinch
1539 error then it is ignored. Mainly this is used to ignore sigwinch
1541 (terminal resize). """
1540 (terminal resize). """
1542
1541
1543 # if select() is interrupted by a signal (errno==EINTR) then
1542 # if select() is interrupted by a signal (errno==EINTR) then
1544 # we loop back and enter the select() again.
1543 # we loop back and enter the select() again.
1545 if timeout is not None:
1544 if timeout is not None:
1546 end_time = time.time() + timeout
1545 end_time = time.time() + timeout
1547 while True:
1546 while True:
1548 try:
1547 try:
1549 return select.select (iwtd, owtd, ewtd, timeout)
1548 return select.select (iwtd, owtd, ewtd, timeout)
1550 except select.error, e:
1549 except select.error, e:
1551 if e[0] == errno.EINTR:
1550 if e[0] == errno.EINTR:
1552 # if we loop back we have to subtract the amount of time we already waited.
1551 # if we loop back we have to subtract the amount of time we already waited.
1553 if timeout is not None:
1552 if timeout is not None:
1554 timeout = end_time - time.time()
1553 timeout = end_time - time.time()
1555 if timeout < 0:
1554 if timeout < 0:
1556 return ([],[],[])
1555 return ([],[],[])
1557 else: # something else caused the select.error, so this really is an exception
1556 else: # something else caused the select.error, so this really is an exception
1558 raise
1557 raise
1559
1558
1560 ##############################################################################
1559 ##############################################################################
1561 # The following methods are no longer supported or allowed.
1560 # The following methods are no longer supported or allowed.
1562
1561
1563 def setmaxread (self, maxread):
1562 def setmaxread (self, maxread):
1564
1563
1565 """This method is no longer supported or allowed. I don't like getters
1564 """This method is no longer supported or allowed. I don't like getters
1566 and setters without a good reason. """
1565 and setters without a good reason. """
1567
1566
1568 raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the maxread member variable.')
1567 raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the maxread member variable.')
1569
1568
1570 def setlog (self, fileobject):
1569 def setlog (self, fileobject):
1571
1570
1572 """This method is no longer supported or allowed.
1571 """This method is no longer supported or allowed.
1573 """
1572 """
1574
1573
1575 raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the logfile member variable.')
1574 raise ExceptionPexpect ('This method is no longer supported or allowed. Just assign a value to the logfile member variable.')
1576
1575
1577 ##############################################################################
1576 ##############################################################################
1578 # End of spawn class
1577 # End of spawn class
1579 ##############################################################################
1578 ##############################################################################
1580
1579
1581 class searcher_string (object):
1580 class searcher_string (object):
1582
1581
1583 """This is a plain string search helper for the spawn.expect_any() method.
1582 """This is a plain string search helper for the spawn.expect_any() method.
1584
1583
1585 Attributes:
1584 Attributes:
1586
1585
1587 eof_index - index of EOF, or -1
1586 eof_index - index of EOF, or -1
1588 timeout_index - index of TIMEOUT, or -1
1587 timeout_index - index of TIMEOUT, or -1
1589
1588
1590 After a successful match by the search() method the following attributes
1589 After a successful match by the search() method the following attributes
1591 are available:
1590 are available:
1592
1591
1593 start - index into the buffer, first byte of match
1592 start - index into the buffer, first byte of match
1594 end - index into the buffer, first byte after match
1593 end - index into the buffer, first byte after match
1595 match - the matching string itself
1594 match - the matching string itself
1596 """
1595 """
1597
1596
1598 def __init__(self, strings):
1597 def __init__(self, strings):
1599
1598
1600 """This creates an instance of searcher_string. This argument 'strings'
1599 """This creates an instance of searcher_string. This argument 'strings'
1601 may be a list; a sequence of strings; or the EOF or TIMEOUT types. """
1600 may be a list; a sequence of strings; or the EOF or TIMEOUT types. """
1602
1601
1603 self.eof_index = -1
1602 self.eof_index = -1
1604 self.timeout_index = -1
1603 self.timeout_index = -1
1605 self._strings = []
1604 self._strings = []
1606 for n, s in zip(range(len(strings)), strings):
1605 for n, s in zip(range(len(strings)), strings):
1607 if s is EOF:
1606 if s is EOF:
1608 self.eof_index = n
1607 self.eof_index = n
1609 continue
1608 continue
1610 if s is TIMEOUT:
1609 if s is TIMEOUT:
1611 self.timeout_index = n
1610 self.timeout_index = n
1612 continue
1611 continue
1613 self._strings.append((n, s))
1612 self._strings.append((n, s))
1614
1613
1615 def __str__(self):
1614 def __str__(self):
1616
1615
1617 """This returns a human-readable string that represents the state of
1616 """This returns a human-readable string that represents the state of
1618 the object."""
1617 the object."""
1619
1618
1620 ss = [ (ns[0],' %d: "%s"' % ns) for ns in self._strings ]
1619 ss = [ (ns[0],' %d: "%s"' % ns) for ns in self._strings ]
1621 ss.append((-1,'searcher_string:'))
1620 ss.append((-1,'searcher_string:'))
1622 if self.eof_index >= 0:
1621 if self.eof_index >= 0:
1623 ss.append ((self.eof_index,' %d: EOF' % self.eof_index))
1622 ss.append ((self.eof_index,' %d: EOF' % self.eof_index))
1624 if self.timeout_index >= 0:
1623 if self.timeout_index >= 0:
1625 ss.append ((self.timeout_index,' %d: TIMEOUT' % self.timeout_index))
1624 ss.append ((self.timeout_index,' %d: TIMEOUT' % self.timeout_index))
1626 ss.sort()
1625 ss.sort()
1627 ss = zip(*ss)[1]
1626 ss = zip(*ss)[1]
1628 return '\n'.join(ss)
1627 return '\n'.join(ss)
1629
1628
1630 def search(self, buffer, freshlen, searchwindowsize=None):
1629 def search(self, buffer, freshlen, searchwindowsize=None):
1631
1630
1632 """This searches 'buffer' for the first occurence of one of the search
1631 """This searches 'buffer' for the first occurence of one of the search
1633 strings. 'freshlen' must indicate the number of bytes at the end of
1632 strings. 'freshlen' must indicate the number of bytes at the end of
1634 'buffer' which have not been searched before. It helps to avoid
1633 'buffer' which have not been searched before. It helps to avoid
1635 searching the same, possibly big, buffer over and over again.
1634 searching the same, possibly big, buffer over and over again.
1636
1635
1637 See class spawn for the 'searchwindowsize' argument.
1636 See class spawn for the 'searchwindowsize' argument.
1638
1637
1639 If there is a match this returns the index of that string, and sets
1638 If there is a match this returns the index of that string, and sets
1640 'start', 'end' and 'match'. Otherwise, this returns -1. """
1639 'start', 'end' and 'match'. Otherwise, this returns -1. """
1641
1640
1642 absurd_match = len(buffer)
1641 absurd_match = len(buffer)
1643 first_match = absurd_match
1642 first_match = absurd_match
1644
1643
1645 # 'freshlen' helps a lot here. Further optimizations could
1644 # 'freshlen' helps a lot here. Further optimizations could
1646 # possibly include:
1645 # possibly include:
1647 #
1646 #
1648 # using something like the Boyer-Moore Fast String Searching
1647 # using something like the Boyer-Moore Fast String Searching
1649 # Algorithm; pre-compiling the search through a list of
1648 # Algorithm; pre-compiling the search through a list of
1650 # strings into something that can scan the input once to
1649 # strings into something that can scan the input once to
1651 # search for all N strings; realize that if we search for
1650 # search for all N strings; realize that if we search for
1652 # ['bar', 'baz'] and the input is '...foo' we need not bother
1651 # ['bar', 'baz'] and the input is '...foo' we need not bother
1653 # rescanning until we've read three more bytes.
1652 # rescanning until we've read three more bytes.
1654 #
1653 #
1655 # Sadly, I don't know enough about this interesting topic. /grahn
1654 # Sadly, I don't know enough about this interesting topic. /grahn
1656
1655
1657 for index, s in self._strings:
1656 for index, s in self._strings:
1658 if searchwindowsize is None:
1657 if searchwindowsize is None:
1659 # the match, if any, can only be in the fresh data,
1658 # the match, if any, can only be in the fresh data,
1660 # or at the very end of the old data
1659 # or at the very end of the old data
1661 offset = -(freshlen+len(s))
1660 offset = -(freshlen+len(s))
1662 else:
1661 else:
1663 # better obey searchwindowsize
1662 # better obey searchwindowsize
1664 offset = -searchwindowsize
1663 offset = -searchwindowsize
1665 n = buffer.find(s, offset)
1664 n = buffer.find(s, offset)
1666 if n >= 0 and n < first_match:
1665 if n >= 0 and n < first_match:
1667 first_match = n
1666 first_match = n
1668 best_index, best_match = index, s
1667 best_index, best_match = index, s
1669 if first_match == absurd_match:
1668 if first_match == absurd_match:
1670 return -1
1669 return -1
1671 self.match = best_match
1670 self.match = best_match
1672 self.start = first_match
1671 self.start = first_match
1673 self.end = self.start + len(self.match)
1672 self.end = self.start + len(self.match)
1674 return best_index
1673 return best_index
1675
1674
1676 class searcher_re (object):
1675 class searcher_re (object):
1677
1676
1678 """This is regular expression string search helper for the
1677 """This is regular expression string search helper for the
1679 spawn.expect_any() method.
1678 spawn.expect_any() method.
1680
1679
1681 Attributes:
1680 Attributes:
1682
1681
1683 eof_index - index of EOF, or -1
1682 eof_index - index of EOF, or -1
1684 timeout_index - index of TIMEOUT, or -1
1683 timeout_index - index of TIMEOUT, or -1
1685
1684
1686 After a successful match by the search() method the following attributes
1685 After a successful match by the search() method the following attributes
1687 are available:
1686 are available:
1688
1687
1689 start - index into the buffer, first byte of match
1688 start - index into the buffer, first byte of match
1690 end - index into the buffer, first byte after match
1689 end - index into the buffer, first byte after match
1691 match - the re.match object returned by a succesful re.search
1690 match - the re.match object returned by a succesful re.search
1692
1691
1693 """
1692 """
1694
1693
1695 def __init__(self, patterns):
1694 def __init__(self, patterns):
1696
1695
1697 """This creates an instance that searches for 'patterns' Where
1696 """This creates an instance that searches for 'patterns' Where
1698 'patterns' may be a list or other sequence of compiled regular
1697 'patterns' may be a list or other sequence of compiled regular
1699 expressions, or the EOF or TIMEOUT types."""
1698 expressions, or the EOF or TIMEOUT types."""
1700
1699
1701 self.eof_index = -1
1700 self.eof_index = -1
1702 self.timeout_index = -1
1701 self.timeout_index = -1
1703 self._searches = []
1702 self._searches = []
1704 for n, s in zip(range(len(patterns)), patterns):
1703 for n, s in zip(range(len(patterns)), patterns):
1705 if s is EOF:
1704 if s is EOF:
1706 self.eof_index = n
1705 self.eof_index = n
1707 continue
1706 continue
1708 if s is TIMEOUT:
1707 if s is TIMEOUT:
1709 self.timeout_index = n
1708 self.timeout_index = n
1710 continue
1709 continue
1711 self._searches.append((n, s))
1710 self._searches.append((n, s))
1712
1711
1713 def __str__(self):
1712 def __str__(self):
1714
1713
1715 """This returns a human-readable string that represents the state of
1714 """This returns a human-readable string that represents the state of
1716 the object."""
1715 the object."""
1717
1716
1718 ss = [ (n,' %d: re.compile("%s")' % (n,str(s.pattern))) for n,s in self._searches]
1717 ss = [ (n,' %d: re.compile("%s")' % (n,str(s.pattern))) for n,s in self._searches]
1719 ss.append((-1,'searcher_re:'))
1718 ss.append((-1,'searcher_re:'))
1720 if self.eof_index >= 0:
1719 if self.eof_index >= 0:
1721 ss.append ((self.eof_index,' %d: EOF' % self.eof_index))
1720 ss.append ((self.eof_index,' %d: EOF' % self.eof_index))
1722 if self.timeout_index >= 0:
1721 if self.timeout_index >= 0:
1723 ss.append ((self.timeout_index,' %d: TIMEOUT' % self.timeout_index))
1722 ss.append ((self.timeout_index,' %d: TIMEOUT' % self.timeout_index))
1724 ss.sort()
1723 ss.sort()
1725 ss = zip(*ss)[1]
1724 ss = zip(*ss)[1]
1726 return '\n'.join(ss)
1725 return '\n'.join(ss)
1727
1726
1728 def search(self, buffer, freshlen, searchwindowsize=None):
1727 def search(self, buffer, freshlen, searchwindowsize=None):
1729
1728
1730 """This searches 'buffer' for the first occurence of one of the regular
1729 """This searches 'buffer' for the first occurence of one of the regular
1731 expressions. 'freshlen' must indicate the number of bytes at the end of
1730 expressions. 'freshlen' must indicate the number of bytes at the end of
1732 'buffer' which have not been searched before.
1731 'buffer' which have not been searched before.
1733
1732
1734 See class spawn for the 'searchwindowsize' argument.
1733 See class spawn for the 'searchwindowsize' argument.
1735
1734
1736 If there is a match this returns the index of that string, and sets
1735 If there is a match this returns the index of that string, and sets
1737 'start', 'end' and 'match'. Otherwise, returns -1."""
1736 'start', 'end' and 'match'. Otherwise, returns -1."""
1738
1737
1739 absurd_match = len(buffer)
1738 absurd_match = len(buffer)
1740 first_match = absurd_match
1739 first_match = absurd_match
1741 # 'freshlen' doesn't help here -- we cannot predict the
1740 # 'freshlen' doesn't help here -- we cannot predict the
1742 # length of a match, and the re module provides no help.
1741 # length of a match, and the re module provides no help.
1743 if searchwindowsize is None:
1742 if searchwindowsize is None:
1744 searchstart = 0
1743 searchstart = 0
1745 else:
1744 else:
1746 searchstart = max(0, len(buffer)-searchwindowsize)
1745 searchstart = max(0, len(buffer)-searchwindowsize)
1747 for index, s in self._searches:
1746 for index, s in self._searches:
1748 match = s.search(buffer, searchstart)
1747 match = s.search(buffer, searchstart)
1749 if match is None:
1748 if match is None:
1750 continue
1749 continue
1751 n = match.start()
1750 n = match.start()
1752 if n < first_match:
1751 if n < first_match:
1753 first_match = n
1752 first_match = n
1754 the_match = match
1753 the_match = match
1755 best_index = index
1754 best_index = index
1756 if first_match == absurd_match:
1755 if first_match == absurd_match:
1757 return -1
1756 return -1
1758 self.start = first_match
1757 self.start = first_match
1759 self.match = the_match
1758 self.match = the_match
1760 self.end = self.match.end()
1759 self.end = self.match.end()
1761 return best_index
1760 return best_index
1762
1761
1763 def which (filename):
1762 def which (filename):
1764
1763
1765 """This takes a given filename; tries to find it in the environment path;
1764 """This takes a given filename; tries to find it in the environment path;
1766 then checks if it is executable. This returns the full path to the filename
1765 then checks if it is executable. This returns the full path to the filename
1767 if found and executable. Otherwise this returns None."""
1766 if found and executable. Otherwise this returns None."""
1768
1767
1769 # Special case where filename already contains a path.
1768 # Special case where filename already contains a path.
1770 if os.path.dirname(filename) != '':
1769 if os.path.dirname(filename) != '':
1771 if os.access (filename, os.X_OK):
1770 if os.access (filename, os.X_OK):
1772 return filename
1771 return filename
1773
1772
1774 if not os.environ.has_key('PATH') or os.environ['PATH'] == '':
1773 if not os.environ.has_key('PATH') or os.environ['PATH'] == '':
1775 p = os.defpath
1774 p = os.defpath
1776 else:
1775 else:
1777 p = os.environ['PATH']
1776 p = os.environ['PATH']
1778
1777
1779 # Oddly enough this was the one line that made Pexpect
1778 # Oddly enough this was the one line that made Pexpect
1780 # incompatible with Python 1.5.2.
1779 # incompatible with Python 1.5.2.
1781 #pathlist = p.split (os.pathsep)
1780 pathlist = p.split(os.pathsep)
1782 pathlist = string.split (p, os.pathsep)
1783
1781
1784 for path in pathlist:
1782 for path in pathlist:
1785 f = os.path.join(path, filename)
1783 f = os.path.join(path, filename)
1786 if os.access(f, os.X_OK):
1784 if os.access(f, os.X_OK):
1787 return f
1785 return f
1788 return None
1786 return None
1789
1787
1790 def split_command_line(command_line):
1788 def split_command_line(command_line):
1791
1789
1792 """This splits a command line into a list of arguments. It splits arguments
1790 """This splits a command line into a list of arguments. It splits arguments
1793 on spaces, but handles embedded quotes, doublequotes, and escaped
1791 on spaces, but handles embedded quotes, doublequotes, and escaped
1794 characters. It's impossible to do this with a regular expression, so I
1792 characters. It's impossible to do this with a regular expression, so I
1795 wrote a little state machine to parse the command line. """
1793 wrote a little state machine to parse the command line. """
1796
1794
1797 arg_list = []
1795 arg_list = []
1798 arg = ''
1796 arg = ''
1799
1797
1800 # Constants to name the states we can be in.
1798 # Constants to name the states we can be in.
1801 state_basic = 0
1799 state_basic = 0
1802 state_esc = 1
1800 state_esc = 1
1803 state_singlequote = 2
1801 state_singlequote = 2
1804 state_doublequote = 3
1802 state_doublequote = 3
1805 state_whitespace = 4 # The state of consuming whitespace between commands.
1803 state_whitespace = 4 # The state of consuming whitespace between commands.
1806 state = state_basic
1804 state = state_basic
1807
1805
1808 for c in command_line:
1806 for c in command_line:
1809 if state == state_basic or state == state_whitespace:
1807 if state == state_basic or state == state_whitespace:
1810 if c == '\\': # Escape the next character
1808 if c == '\\': # Escape the next character
1811 state = state_esc
1809 state = state_esc
1812 elif c == r"'": # Handle single quote
1810 elif c == r"'": # Handle single quote
1813 state = state_singlequote
1811 state = state_singlequote
1814 elif c == r'"': # Handle double quote
1812 elif c == r'"': # Handle double quote
1815 state = state_doublequote
1813 state = state_doublequote
1816 elif c.isspace():
1814 elif c.isspace():
1817 # Add arg to arg_list if we aren't in the middle of whitespace.
1815 # Add arg to arg_list if we aren't in the middle of whitespace.
1818 if state == state_whitespace:
1816 if state == state_whitespace:
1819 None # Do nothing.
1817 None # Do nothing.
1820 else:
1818 else:
1821 arg_list.append(arg)
1819 arg_list.append(arg)
1822 arg = ''
1820 arg = ''
1823 state = state_whitespace
1821 state = state_whitespace
1824 else:
1822 else:
1825 arg = arg + c
1823 arg = arg + c
1826 state = state_basic
1824 state = state_basic
1827 elif state == state_esc:
1825 elif state == state_esc:
1828 arg = arg + c
1826 arg = arg + c
1829 state = state_basic
1827 state = state_basic
1830 elif state == state_singlequote:
1828 elif state == state_singlequote:
1831 if c == r"'":
1829 if c == r"'":
1832 state = state_basic
1830 state = state_basic
1833 else:
1831 else:
1834 arg = arg + c
1832 arg = arg + c
1835 elif state == state_doublequote:
1833 elif state == state_doublequote:
1836 if c == r'"':
1834 if c == r'"':
1837 state = state_basic
1835 state = state_basic
1838 else:
1836 else:
1839 arg = arg + c
1837 arg = arg + c
1840
1838
1841 if arg != '':
1839 if arg != '':
1842 arg_list.append(arg)
1840 arg_list.append(arg)
1843 return arg_list
1841 return arg_list
1844
1842
1845 # vi:ts=4:sw=4:expandtab:ft=python:
1843 # vi:ts=4:sw=4:expandtab:ft=python:
General Comments 0
You need to be logged in to leave comments. Login now