在Ubuntu和ArchLinux上测试了这个,我得到了
from ctypes import *
libc = CDLL('libc.so.6')
libc.environ()
Segmentation fault
为什么?
答案 0 :(得分:7)
如果我正确阅读了联机帮助页,environ
是char**
,而不是函数。
如果你想获得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
...