gpt4 book ai didi

在 xlib 上使用 ctypes 时出现 Python3 段错误,python2 有效

转载 作者:行者123 更新时间:2023-11-28 21:46:28 24 4
gpt4 key购买 nike

下面的代码是多年前在网上搜到的,在 python2 中运行良好。它提供 X 服务器上的当前空闲时间。

import ctypes, os, subprocess
class XScreenSaverInfo( ctypes.Structure ):
_fields_ = [("window", ctypes.c_ulong), ("state", ctypes.c_int), ("kind", ctypes.c_int), ("since", ctypes.c_ulong), ("idle", ctypes.c_ulong), ("event_mask", ctypes.c_ulong)]

xlib = ctypes.cdll.LoadLibrary("libX11.so.6")
xss = ctypes.cdll.LoadLibrary("libXss.so.1")
display = xlib.XOpenDisplay(os.environ["DISPLAY"])
xss.XScreenSaverAllocInfo.restype = ctypes.POINTER(XScreenSaverInfo)
xssinfo = xss.XScreenSaverAllocInfo()

xss.XScreenSaverQueryInfo(display, xlib.XDefaultRootWindow(display), xssinfo)

xssinfo.contents.idle

我可以将其放入 python2.7.10 shell 中并得到我想要的。然而,在 python3.4.3 shell 上做同样的事情会让我在这一行出现段错误

xss.XScreenSaverQueryInfo(display, xlib.XDefaultRootWindow(display), xssinfo)

是不是我的py3环境坏了? py3 有不同的做法吗?

最佳答案

Python 3 的 ctypes 模块没有重大变化。 但是在Python3中os.environ值是unicode字符串,与python2的字节串和这个causes the segmentation fault相反.如此变化:

display = xlib.XOpenDisplay(os.environ["DISPLAY"])

收件人:

display = xlib.XOpenDisplay(bytes(os.environ["DISPLAY"], 'ascii'))

修复段错误。

如果您希望代码在 python 2 和 3 中都有效,您需要使用 encode 方法:

display = xlib.XOpenDisplay(os.environ["DISPLAY"].encode('ascii'))

关于在 xlib 上使用 ctypes 时出现 Python3 段错误,python2 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37918260/

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