Почему Python вызывает ошибку при попытке вызвать environment, используя ctypes в libc? - PullRequest
6 голосов
/ 30 января 2012

Протестировал это как на Ubuntu, так и на ArchLinux, я получаю

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

Почему?

Ответы [ 2 ]

7 голосов
/ 30 января 2012

Если я правильно прочитал man-страницу, environ - это char**, а не функция.Если вы хотите получить окружение, в соответствии с этой записью , вы можете сделать:

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

Но для меня он возвращает 'c_void_p (None)', не зная, почему это происходит(я знаю, что я объявил только как char *, но так как он возвращает None, их ничто не может разыменовать).

В любом случае, у вас все еще есть способ "python":

import os
print os.environ

Или, если вы ищете определенную строку в среде, используя ctypes, для какой-то функции вам нужно переопределить рестайп по умолчанию:

from ctypes import *
libc = CDLL('libc.so.6')
getenv = libc.getenv
getenv.restype = c_char_p
print getenv('HOME')
0 голосов
/ 11 ноября 2015

Вот как вы можете напечатать C Environment, используя ctypes в Ubuntu:

#!/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
...
...