程序退出时在消息中忽略异常

吉耶

我最初想在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()

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

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并等待似乎不足。

米哈伊尔·杰拉西莫夫(Mikhail Gerasimov)

请注意,与同步编程不同,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()

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章