Sitelet https://github.com/python/cpython/issues/100133#issuecomment-1347242553
Skip to content

asyncio subprocess stdout occasionally lost (3.11.0 → 3.11.1 regression) #100133

Description

@AMDmi3

Bug report

So, I've updated python from 3.11.0 to 3.11.1 and one of my utilities which runs a lot of external processes with asyncio.create_subprocess_exec started failing in different places in weird ways. It turned out that with some probability asyncio.subprocess.Process.communicate() would now return an empty stdout. Here's a repro:

import asyncio

async def main():
    attempt = 1
    while True:
        proc = await asyncio.create_subprocess_exec('/bin/echo', 'test', stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE)

        stdout, stderr = await proc.communicate()

        text = stdout.decode('utf-8').strip()

        if text != 'test':
            raise RuntimeError(f'FAIL on attempt {attempt}: output="{text}"')

        attempt += 1

asyncio.run(main())

You may have to wait somewhat for the problem to reproduce, but for me it fails in under 15 seconds more or less reliably. Possible output:

RuntimeError: FAIL on attempt 3823: output=""

Your environment

  • CPython versions tested on: 3.11.1
  • Operating system and architecture: FreeBSD 13.1 amd64

Linked PRs

Activity

  1. added
    type-bugAn unexpected behavior, bug, or error
    on Dec 9, 2022
  2. changed the title [-]asyncio subprocess stdout lost (3.11.0 → 3.11.1 regression)[/-] [+]asyncio subprocess stdout occasionally lost (3.11.0 → 3.11.1 regression)[/+] on Dec 9, 2022
  3. AMDmi3 commented on Dec 9, 2022

    @AMDmi3
    ContributorAuthor

    @kumaraditya303 FYI, there were some commits to asyncio subprocess from you recently.

  4. mportesdev commented on Dec 9, 2022

    @mportesdev

    I experienced this too, reported it here with some additional info:
    https://discuss.python.org/t/python-3-11-1-async-subprocess-stdout-lost-when-piped/21788

  5. mportesdev commented on Dec 9, 2022

    @mportesdev

    For me, the following script always results with an unexpected [b'', b'', b'baz\n'] both in Python 3.11.1 and 3.12.0a3.

    import asyncio
    
    
    async def get_command_stdout(cmd, *args):
        proc = await asyncio.create_subprocess_exec(
            cmd, *args, stdout=asyncio.subprocess.PIPE,
        )
        stdout, _ = await proc.communicate()
        return stdout
    
    
    async def main():
        return await asyncio.gather(
            get_command_stdout('echo', 'foo'),
            get_command_stdout('echo', 'bar'),
            get_command_stdout('echo', 'baz'),
        )
    
    
    if __name__ == '__main__':
        print(asyncio.run(main()))
  6. moved this to Todo in asyncioon Dec 9, 2022
  7. gvanrossum commented on Dec 9, 2022

    @gvanrossum
    Member

    Let’s bisect that repro to a specific commit.

  8. gvanrossum commented on Dec 12, 2022

    @gvanrossum
    Member

    The bisection points to

    commit 7015e1379791cbf19908cd1a7c668a5d6e7165d5
    Date:   Wed Oct 5 10:15:31 2022
    
        gh-88050: Fix asyncio subprocess to kill process cleanly when process is blocked (#32073)
    

    We will get it fixed in 3.11.2.

  9. kumaraditya303 commented on Dec 12, 2022

    @kumaraditya303
    Contributor

    Thanks for the bug report, I have a fix for this #100154, can you verify it that it works as you expect? Thanks @AMDmi3

  10. AMDmi3 commented on Dec 12, 2022

    @AMDmi3
    ContributorAuthor

    The fix works for me, thank you!

  11. Repository owner moved this from Todo to Done in asyncioon Dec 21, 2022
  12. added a commit that references this issue on Dec 21, 2022
  13. added 2 commits that reference this issue on Dec 21, 2022
  14. added a commit that references this issue on Jan 12, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

3.11only security fixes3.12only security fixestopic-asynciotype-bugAn unexpected behavior, bug, or error

Projects

  • Status
    Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions