asyncio, tulip issue 209: Fix subprocess for close_fds=False on Python 3.3

Mark the write end of the stdin pipe as non-inheritable.
This commit is contained in:
Victor Stinner 2014-12-11 23:30:17 +01:00
parent df75d5b402
commit 1e40f10886
2 changed files with 43 additions and 0 deletions

View file

@ -198,6 +198,27 @@ class SubprocessMixin:
self.assertTrue(transport.pause_reading.called)
self.assertTrue(transport.resume_reading.called)
def test_stdin_not_inheritable(self):
# Tulip issue #209: stdin must not be inheritable, otherwise
# the Process.communicate() hangs
@asyncio.coroutine
def len_message(message):
code = 'import sys; data = sys.stdin.read(); print(len(data))'
proc = yield from asyncio.create_subprocess_exec(
sys.executable, '-c', code,
stdin=asyncio.subprocess.PIPE,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
close_fds=False,
loop=self.loop)
stdout, stderr = yield from proc.communicate(message)
exitcode = yield from proc.wait()
return (stdout, exitcode)
output, exitcode = self.loop.run_until_complete(len_message(b'abc'))
self.assertEqual(output.rstrip(), b'3')
self.assertEqual(exitcode, 0)
if sys.platform != 'win32':
# Unix