summaryrefslogtreecommitdiff
path: root/pexpect
diff options
context:
space:
mode:
authorThomas Kluyver <takowl@gmail.com>2017-02-07 12:28:57 +0000
committerGitHub <noreply@github.com>2017-02-07 12:28:57 +0000
commitcde69e47d46a6f444920b5010e4e7fb3c01f63fc (patch)
tree1ee6785869f944bd1036a5868b229f3d6b79a500 /pexpect
parentcb440d20f9dd3488f61d5af8b2f7e8a8bad2c7dd (diff)
parente35cc4b7711a9b5ab556f90707d21922257cc5cc (diff)
downloadpexpect-cde69e47d46a6f444920b5010e4e7fb3c01f63fc.tar.gz
Merge pull request #376 from gescheit/master
dont remove reference to _UnixReadPipeTransport
Diffstat (limited to 'pexpect')
-rw-r--r--pexpect/async.py20
-rw-r--r--pexpect/spawnbase.py2
2 files changed, 16 insertions, 6 deletions
diff --git a/pexpect/async.py b/pexpect/async.py
index 136fc0e..3a1a1ad 100644
--- a/pexpect/async.py
+++ b/pexpect/async.py
@@ -12,22 +12,30 @@ def expect_async(expecter, timeout=None):
idx = expecter.new_data(previously_read)
if idx is not None:
return idx
-
- transport, pw = yield from asyncio.get_event_loop()\
- .connect_read_pipe(lambda: PatternWaiter(expecter), expecter.spawn)
-
+ if not expecter.spawn.async_pw_transport:
+ pw = PatternWaiter()
+ pw.set_expecter(expecter)
+ transport, pw = yield from asyncio.get_event_loop()\
+ .connect_read_pipe(lambda: pw, expecter.spawn)
+ expecter.spawn.async_pw_transport = pw, transport
+ else:
+ pw, transport = expecter.spawn.async_pw_transport
+ pw.set_expecter(expecter)
+ transport.resume_reading()
try:
return (yield from asyncio.wait_for(pw.fut, timeout))
except asyncio.TimeoutError as e:
transport.pause_reading()
return expecter.timeout(e)
+
class PatternWaiter(asyncio.Protocol):
transport = None
- def __init__(self, expecter):
+
+ def set_expecter(self, expecter):
self.expecter = expecter
self.fut = asyncio.Future()
-
+
def found(self, result):
if not self.fut.done():
self.fut.set_result(result)
diff --git a/pexpect/spawnbase.py b/pexpect/spawnbase.py
index 5dd24b5..cb64582 100644
--- a/pexpect/spawnbase.py
+++ b/pexpect/spawnbase.py
@@ -115,6 +115,8 @@ class SpawnBase(object):
self.linesep = os.linesep.decode('ascii')
# This can handle unicode in both Python 2 and 3
self.write_to_stdout = sys.stdout.write
+ # storage for async transport
+ self.async_pw_transport = None
def _log(self, s, direction):
if self.logfile is not None: