gpt4 book ai didi

python - 程序退出时消息中的异常被忽略

转载 作者:可可西里 更新时间:2023-11-01 09:32:40 26 4
gpt4 key购买 nike

我最初想在 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 和等待似乎还不够。

最佳答案

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

enter image description here

您应该修复您的代码以等待此协程:

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

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

关于python - 程序退出时消息中的异常被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43907705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com