python - 在 Python 中使用 GTK/GIO 异步读取
问题描述
我正在尝试在 Python 中使用 GTK/GIO 进行异步读取,但是虽然读取本身可以正常工作(因为仅在输入所需的字节数后才调用回调),但我无法找到任何实际访问结果的方法。
鉴于此代码:
from gi.repository import Gtk, GLib, Gio
import sys
def callback(stream, task):
result = stream.read_all_finish(task)
print(stream, task, task.get_user_data(), task.get_task_data(), result, buf)
Gtk.main_quit()
buf = bytearray(4)
stream = Gio.UnixInputStream.new(sys.stdin.fileno(), False)
stream.read_all_async(buf, GLib.PRIORITY_DEFAULT, None, callback)
Gtk.main()
运行时,它会等到至少输入了 4 个字节,所以一个a<return>
不会导致它退出,但第二个会。打印结果如下:
<Gio.UnixInputStream object at 0x7f1045dc3708 (GUnixInputStream at 0x1b8c160)> <Gio.Task object at 0x7f1045dc3bd0 (GTask at 0x1b8e860)> 28890912 28207104 (True, bytes_read=4) bytearray(b'\x00\x00\x00\x00')
换句话说...
get_user_data()
并且get_task_data()
似乎没有帮助,因为它们返回整数(我不知道其含义)- from 的返回值
read_all_finish()
似乎没有帮助,因为它只是一个成功/失败 bool 加上一个 bytes_read 整数字段 - 我们提供的缓冲区
read_all_async()
似乎没有任何帮助,因为它保持不变,即使人们可能希望它保存读取的结果......
我也试过...
- 在调用之前检查相同的东西
read_all_finish()
,以防调用出于某种原因执行诸如清除缓冲区之类的操作 - 没有骰子,会给出相同的结果 - 使用
array('b', [0]*4)
而不是bytearray
- 也可以产生相同的效果 - 使用整数计数代替
buf
(因为似乎旧版本的 API 以这种方式工作) - 这只会导致TypeError: Must be sequence, not int
- 使用文件而不是标准输入 - 没有变化
- 使用
read_async()
/read_finish()
代替 - 没有变化 - ...可能还有一些我什至不记得了
在这一点上,我真的束手无策了——我只是做错了什么,还是 GIO 的 python 绑定在异步方法方面被严重破坏了?
解决方案
尽管没有抱怨标准 python bytearray
/ array
,但它实际上不适用于那些;你需要使用GLib.ByteArray
它才能工作。
换句话说,这将起作用:
from gi.repository import Gtk, GLib, Gio
import sys
def callback(stream, task):
result = stream.read_all_finish(task)
print(buf)
Gtk.main_quit()
buf = GLib.ByteArray.new_take(bytes(4))
stream = Gio.UnixInputStream.new(sys.stdin.fileno(), False)
stream.read_all_async(buf, GLib.PRIORITY_DEFAULT, None, callback)
Gtk.main()
推荐阅读
- python - 使用矩阵作为正态分布的尺度
- python - TypeError:单例数组数组(0.5)不能被视为有效集合
- android - WebAuthenticator 总是跳过登录页面,如何为新用户获取新的登录表单?
- android - Hilt : 带有 Koin 等参数的字段注入
- python - 删除熊猫数据框中括号内的数字
- ios - Swift 更新程序约束
- javascript - 如何在 Ag Grid for React.js 中做响应式列宽?
- python - AssertionError:试图导出引用未跟踪资源的函数
- arrays - CS50-pset2:可读性。结果不正确
- sass - Liferay 7.3.2:更改页面后 Aria 扩展卡在 true 上