为什么在尝试使用libc上的ctypes调用environ时会出现Python段错误?

时间:2012-01-30 10:44:36

标签: python linux ctypes

在Ubuntu和ArchLinux上测试了这个,我得到了

from ctypes import *
libc = CDLL('libc.so.6')
libc.environ()
Segmentation fault

为什么?

2 个答案:

答案 0 :(得分:7)

如果我正确阅读了联机帮助页,environchar**,而不是函数。 如果你想获得environ var,根据this post,你可以这样做:

from ctypes import *
libc = CDLL('libc.so.6')
environ = c_char_p.in_dll(libc, 'environ')

但它为我返回'c_void_p(无)',不知道为什么会发生这种情况(我知道我只声明为char *,但由于它返回None,因此它们无需取消引用)

无论如何,你还有“python”方式:

import os
print os.environ

或者,如果使用ctypes在environ中搜索特定字符串,对于某些函数,则需要重新定义默认的restype:

from ctypes import *
libc = CDLL('libc.so.6')
getenv = libc.getenv
getenv.restype = c_char_p
print getenv('HOME')

答案 1 :(得分:0)

以下是如何在Ubuntu上使用ctypes打印C环境:

#!/usr/bin/env python2
import ctypes

libc = ctypes.CDLL(None)
environ = ctypes.POINTER(ctypes.c_char_p).in_dll(libc, 'environ')
for envvar in iter(iter(environ).next, None):
    print envvar

输出

LC_PAPER=en_GB.UTF-8
LC_ADDRESS=en_GB.UTF-8
CLUTTER_IM_MODULE=xim
LC_MONETARY=en_GB.UTF-8
VIRTUALENVWRAPPER_PROJECT_FILENAME=.project
SESSION=ubuntu
...