在xlib上使用ctypes时python3段错误,python2有效

时间:2016-06-20 08:53:28

标签: python python-3.x python-2.x xlib

以下代码多年前在互联网上被发现并在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有不同的做法吗?

1 个答案:

答案 0 :(得分:4)

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