Python3 在 xlib 上使用 ctypes 时出现段错误,python2 有效
Python3 segfaults when using ctypes on xlib, python2 works
以下代码是几年前在 Internet 上搜集到的,在 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'))
以下代码是几年前在 Internet 上搜集到的,在 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'))