如何在Python中从GLib.GString获取原始字节?

零施泰纳

我有一个通过GObject自省使用GTK3用Python编写的应用程序(Python 2.7和PyGObject 3.14)。我正在尝试使用WebKit加载网页并访问其加载的所有资源的内容。我可以通过连接到我用来加载页面的WebKitWebView对象资源加载完成的信号来实现此目的。

在信号处理程序中,我使用web_resource参数中WebKitWebResource对象来访问已加载的数据。当get_data()返回的GLib.GString不包含NULL字节时,一切都可以正常工作,我可以使用data.str访问所需的内容。但是,当数据确实包含NULL字节时(当加载的资源的MIME类型是图像时,通常是这种情况),data.len是正确的,但是data.str仅包含直到第一个NULL字节的数据。我可以通过调用data.free_to_bytes()返回GLib.GBytes实例来访问原始字节,但是当信号处理程序返回应用程序段错误时。我正在尝试访问已加载资源中的所有数据。

希望以下代码有助于演示该问题。

from gi.repository import Gtk
from gi.repository import WebKit

def signal_resource_load_finished(webview, frame, resource):
    gstring = resource.get_data()
    print(resource.get_mime_type())
    desired_len = gstring.len
    # gstring.str is missing data because it returns the data up to the first NULL byte
    assert(gstring.str == desired_len) # this assertion fails

    # calling this causes a segfault after the handler returns, but the data is accessible from gbytes.get_data()
    #gbytes = gstring.free_to_bytes()
    #assert(len(gbytes.get_data()) == desired_len) # this assertion succeeds before the segfault
    return

webview = WebKit.WebView()
webview.connect('resource-load-finished', signal_resource_load_finished)
webview.connect('load-finished', Gtk.main_quit)
# lol cat for demo purposes of a resource containing NULL bytes (mime type: image/png)
webview.load_uri('http://images5.fanpop.com/image/photos/30600000/-Magical-Kitty-lol-cats-30656645-1280-800.png')
Gtk.main()
番茄

您不想使用它,free_to_bytes因为它不仅会为您提供所需的字节,而且还会在Python不知道的情况下从内存中释放字符串-正如您所发现的那样,它会使程序崩溃。不幸的是,没有真正设计为保存二进制数据的相应get_bytes方法GLib.String

实际上,我认为WebKit API中的一个错误是资源有效负载只能以形式使用GLib.String他们似乎已经更正了WebKit2中的此错误:http ://webkitgtk.org/reference/webkit2gtk/stable/WebKitWebResource.html

如果可以,请考虑切换到WebKit2 from gi.repository import WebKit2

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从打包的结构中获取原始字节

来自分类Dev

如何从查询字符串获取原始字节

来自分类Dev

在Swift中获取浮点数的原始字节

来自分类Dev

如何在Python中从套接字读取原始字节?

来自分类Dev

我们如何使用Class.forName获取原始字节类?

来自分类Dev

如何从方案字节向量中检索外来原始字节指针?

来自分类Dev

如何在python中打印原始unicode?

来自分类Dev

如何在python中创建字节对象?

来自分类Dev

如何在我的String文字中间编码单个原始字节?(例如:“ aaaXbbb”,其中X是原始字节)

来自分类Dev

如何在python 3中有效地将原始字节写入numpy数组数据

来自分类Dev

如何从字节中获取数字?

来自分类Dev

如何在Python中获取原始列表的排序列表索引?

来自分类Dev

如何在Python3中从input()获取字节数组?

来自分类Dev

如何在Python3中从input()获取字节数组?

来自分类Dev

Python如何在8位中获取多字节变量大小?

来自分类Dev

如何让 Class 负责创建大量原始字节?

来自分类Dev

如何在Cassandra 3.3中获取原始行内容

来自分类Dev

如何在prcomp中反转PCA以获取原始数据

来自分类Dev

如何在magento 2.0中获取原始大小的图像URL

来自分类Dev

如何在响应回调中获取原始请求URL?

来自分类Dev

如何在Flickr中获取原始图像的链接

来自分类Dev

如何在Shiro中获取原始请求URL

来自分类Dev

如何在PyKD中获取模块的原始文件名?

来自分类Dev

如何在Swift中获取C指针的原始值?

来自分类Dev

如何在Froala编辑器中获取原始HTML

来自分类Dev

如何在动作处理程序中获取原始事件对象?

来自分类Dev

Python 2 vs 3原始字节输出

来自分类Dev

使用Go中的网络处理原始字节

来自分类Dev

将任何原始数字的原始字节记录到文件中

Related 相关文章

  1. 1

    从打包的结构中获取原始字节

  2. 2

    如何从查询字符串获取原始字节

  3. 3

    在Swift中获取浮点数的原始字节

  4. 4

    如何在Python中从套接字读取原始字节?

  5. 5

    我们如何使用Class.forName获取原始字节类?

  6. 6

    如何从方案字节向量中检索外来原始字节指针?

  7. 7

    如何在python中打印原始unicode?

  8. 8

    如何在python中创建字节对象?

  9. 9

    如何在我的String文字中间编码单个原始字节?(例如:“ aaaXbbb”,其中X是原始字节)

  10. 10

    如何在python 3中有效地将原始字节写入numpy数组数据

  11. 11

    如何从字节中获取数字?

  12. 12

    如何在Python中获取原始列表的排序列表索引?

  13. 13

    如何在Python3中从input()获取字节数组?

  14. 14

    如何在Python3中从input()获取字节数组?

  15. 15

    Python如何在8位中获取多字节变量大小?

  16. 16

    如何让 Class 负责创建大量原始字节?

  17. 17

    如何在Cassandra 3.3中获取原始行内容

  18. 18

    如何在prcomp中反转PCA以获取原始数据

  19. 19

    如何在magento 2.0中获取原始大小的图像URL

  20. 20

    如何在响应回调中获取原始请求URL?

  21. 21

    如何在Flickr中获取原始图像的链接

  22. 22

    如何在Shiro中获取原始请求URL

  23. 23

    如何在PyKD中获取模块的原始文件名?

  24. 24

    如何在Swift中获取C指针的原始值?

  25. 25

    如何在Froala编辑器中获取原始HTML

  26. 26

    如何在动作处理程序中获取原始事件对象?

  27. 27

    Python 2 vs 3原始字节输出

  28. 28

    使用Go中的网络处理原始字节

  29. 29

    将任何原始数字的原始字节记录到文件中

热门标签

归档