Issue
I initially wanted to do async stream communication on windows.
from asyncio import *
from asyncio.subprocess import PIPE, STDOUT, DEVNULL
import sys
async def test(exe):
inst = await create_subprocess_exec(exe, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
inst.stdin.close()
inst.wait()
# for subprocess' pipes on Windows
def initialize_async():
if sys.platform == 'win32':
set_event_loop(ProactorEventLoop())
return get_event_loop()
loop = initialize_async()
loop.run_until_complete(test('attrib.exe'))
loop.close()
The above code generates the following.
Exception ignored in: <bound method BaseSubprocessTransport.__del__ of <_WindowsSubprocessTransport closed pid=65088 running stdin=<_ProactorWritePipeTransport closed> stdout=<_ProactorReadPipeTransport closing fd=476 read=<_OverlappedFuture cancelled>>>>
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\asyncio\base_subprocess.py", line 132, in __del__
self.close()
File "C:\Program Files\Python36\lib\asyncio\base_subprocess.py", line 106, in close
proto.pipe.close()
File "C:\Program Files\Python36\lib\asyncio\proactor_events.py", line 84, in close
self._loop.call_soon(self._call_connection_lost, None)
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 573, in call_soon
self._check_closed()
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 357, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
Exception ignored in: <object repr() failed>
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\asyncio\proactor_events.py", line 95, in __del__
warnings.warn("unclosed transport %r" % self, ResourceWarning,
File "C:\Program Files\Python36\lib\asyncio\proactor_events.py", line 54, in __repr__
info.append('fd=%s' % self._sock.fileno())
File "C:\Program Files\Python36\lib\asyncio\windows_utils.py", line 152, in fileno
raise ValueError("I/O operatioon on closed pipe")
ValueError: I/O operatioon on closed pipe
How can I remove this error? stdin.close and wait seems not sufficient.
Solution
Note, that unlike in synchronous programming many asyncio
functions are actually coroutines
that should be awaited. See how wait()
defined in documentation:
You should fix your code to await this coroutine:
async def test(exe):
inst = await create_subprocess_exec(exe, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
data = await inst.stdout.readline() # readline, for example, is also coroutine.
print(data)
await inst.wait()
You won't see any error now.
Answered By - Mikhail Gerasimov
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.