New submission from Vahid Mardani:

Assume this simple script for reading from stdin:

```python
#! /usr/bin/env python3

import sys
import os
import asyncio


async def main(loop):
    done = False
    fileno = sys.stdin.fileno()

    def _reader():
        nonlocal done
        chunk = os.read(fileno, 1024)
        if not chunk:
            loop.remove_reader(fileno)
            done = True
            return
        print(chunk.decode(), end='')

    loop.add_reader(fileno, _reader)
    while not done:
        await asyncio.sleep(1)


if __name__ == '__main__':
    main_loop = asyncio.get_event_loop()
    main_loop.run_until_complete(main(main_loop))
```

When I run it by:
```bash
$ ./stdin_issue.py <<EOF
> hello
> EOF
```

I get:

```
Traceback (most recent call last):
  File "/usr/lib/python3.5/asyncio/selector_events.py", line 234, in add_reader
    key = self._selector.get_key(fd)
  File "/usr/lib/python3.5/selectors.py", line 191, in get_key
    raise KeyError("{!r} is not registered".format(fileobj)) from None
KeyError: '0 is not registered'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./stdin_issue.py", line 41, in <module>
    main_loop.run_until_complete(main(main_loop))
  File "/usr/lib/python3.5/asyncio/base_events.py", line 387, in 
run_until_complete
    return future.result()
  File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
    raise self._exception
  File "/usr/lib/python3.5/asyncio/tasks.py", line 239, in _step
    result = coro.send(None)
  File "./stdin_issue.py", line 34, in main
    loop.add_reader(fileno, _reader)
  File "/usr/lib/python3.5/asyncio/selector_events.py", line 237, in add_reader
    (handle, None))
  File "/usr/lib/python3.5/selectors.py", line 411, in register
    self._epoll.register(key.fd, epoll_events)
PermissionError: [Errno 1] Operation not permitted
```

But the:

```bash
echo "Hello" | ./stdin_issue.py 
```
 Is working well.

I was already tried this with the `select.select` directly, and it working:

```
def using_select():
    files = [sys.stdin.fileno()]

    while True:
        readables, _, errors = select(files, [], files)
        if errors:
            print('ERROR:', errors)
            return
        if readables:
            for f in readables:
                chunk = os.read(f, 1024)
                if not chunk:
                    return
                print(chunk.decode(), end='')
```

----------
components: asyncio
messages: 288941
nosy: gvanrossum, vahid.mardani, yselivanov
priority: normal
severity: normal
status: open
title: `loop.add_reader` and `<<EOF`
versions: Python 3.5

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue29717>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to