mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
bpo-46364: Use sockets for stdin of asyncio only on AIX (GH-30596)
Signed-off-by: Christoph Hamsen <hamsen.christoph@posteo.de>
Co-authored-by: July Tikhonov <july.tikh@gmail.com>
(cherry picked from commit c9ed0327a9)
Co-authored-by: Christoph Hamsen <37963496+xopham@users.noreply.github.com>
This commit is contained in:
parent
c7662420d6
commit
fa9f65ef58
3 changed files with 24 additions and 4 deletions
|
|
@ -789,12 +789,11 @@ class _UnixSubprocessTransport(base_subprocess.BaseSubprocessTransport):
|
||||||
|
|
||||||
def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs):
|
def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs):
|
||||||
stdin_w = None
|
stdin_w = None
|
||||||
if stdin == subprocess.PIPE:
|
if stdin == subprocess.PIPE and sys.platform.startswith('aix'):
|
||||||
# Use a socket pair for stdin, since not all platforms
|
# Use a socket pair for stdin on AIX, since it does not
|
||||||
# support selecting read events on the write end of a
|
# support selecting read events on the write end of a
|
||||||
# socket (which we use in order to detect closing of the
|
# socket (which we use in order to detect closing of the
|
||||||
# other end). Notably this is needed on AIX, and works
|
# other end).
|
||||||
# just fine on other platforms.
|
|
||||||
stdin, stdin_w = socket.socketpair()
|
stdin, stdin_w = socket.socketpair()
|
||||||
try:
|
try:
|
||||||
self._proc = subprocess.Popen(
|
self._proc = subprocess.Popen(
|
||||||
|
|
|
||||||
|
|
@ -401,6 +401,26 @@ async def empty_error():
|
||||||
self.assertEqual(output, None)
|
self.assertEqual(output, None)
|
||||||
self.assertEqual(exitcode, 0)
|
self.assertEqual(exitcode, 0)
|
||||||
|
|
||||||
|
@unittest.skipIf(sys.platform != 'linux', "Don't have /dev/stdin")
|
||||||
|
def test_devstdin_input(self):
|
||||||
|
|
||||||
|
async def devstdin_input(message):
|
||||||
|
code = 'file = open("/dev/stdin"); data = file.read(); print(len(data))'
|
||||||
|
proc = await asyncio.create_subprocess_exec(
|
||||||
|
sys.executable, '-c', code,
|
||||||
|
stdin=asyncio.subprocess.PIPE,
|
||||||
|
stdout=asyncio.subprocess.PIPE,
|
||||||
|
stderr=asyncio.subprocess.PIPE,
|
||||||
|
close_fds=False,
|
||||||
|
)
|
||||||
|
stdout, stderr = await proc.communicate(message)
|
||||||
|
exitcode = await proc.wait()
|
||||||
|
return (stdout, exitcode)
|
||||||
|
|
||||||
|
output, exitcode = self.loop.run_until_complete(devstdin_input(b'abc'))
|
||||||
|
self.assertEqual(output.rstrip(), b'3')
|
||||||
|
self.assertEqual(exitcode, 0)
|
||||||
|
|
||||||
def test_cancel_process_wait(self):
|
def test_cancel_process_wait(self):
|
||||||
# Issue #23140: cancel Process.wait()
|
# Issue #23140: cancel Process.wait()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Restrict use of sockets instead of pipes for stdin of subprocesses created by :mod:`asyncio` to AIX platform only.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue