在程序退出的消息中忽略exception

我最初想在Windows上进行asynchronousstream通信。

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() 

上面的代码生成以下内容。

 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 

我怎样才能删除这个错误? stdin.close和等待似乎是不够的。

Solutions Collecting From Web of "在程序退出的消息中忽略exception"

请注意,与同步编程不同,许多asyncio函数实际上是应该等待的coroutines 。 看看如何在文档中定义wait()

在这里输入图像说明

你应该修复你的代码来等待这个协程:

 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() 

你现在不会看到任何错误。