Использование другой версии zlib.so, чем в системе с использованием импорта Python cdll - PullRequest
1 голос
/ 04 марта 2011

Привет,

Я пытаюсь изменить zlib и тестировать поведение, поэтому я написал mylib.c и mylib.h.Это формирует оболочку для внутреннего вызова функций zlib (например, InflateInit2()).Я компилирую / связываю с помощью следующих команд:

gcc -g -Wall -Werror -c -std=c99 -I./zlib-1.2.5 -I./ -fPIC mylib.c 
gcc -shared mylib.o -o mylib.so

Затем я импортирую его в python, используя:

mylib = cdll.LoadLibrary(os.getcwd() + '/mylib.so')

Мне нужна версия zlib, отличная от той, которая установлена ​​на моемсистема, поэтому я скачал и скомпилировал файл, отличный от исходного кода (его установка в моей системе делала его нестабильным).Проблема, с которой я сейчас сталкиваюсь, заключается в том, что внесение изменений в скомпилированные пользователем исходные файлы zlib не отражается при использовании mylib в python.Python (или, возможно, мой метод компиляции mylib.so) должен использовать системную версию zlib.Есть ли способ указать "правильную" версию zlib.so.

1 Ответ

1 голос
/ 04 марта 2011

Я считаю, что исходный код Python статически связывается с объединенной копией zlib.Чтобы заставить Python использовать вашу версию, вам, вероятно, потребуется загрузить исходный код Python и создать собственный интерпретатор с замененным измененным исходным кодом zlib.

# system python static lib bundles the zlibmodule.o code
ares% nm -ao /usr/lib/libpython2.6.a|grep initzlib
/usr/lib/libpython2.6.a:zlibmodule.o:0000000000000000 T initzlib

Обновлено: спасибо за дополнительную информацию, я вижучто ты пытаешься сделать

Как вы обнаружили, перенос вашего пользовательского zlib в общий объект не будет работать.Вам нужно вызвать ваши пользовательские функции zlib напрямую через дескриптор общего объекта, возвращаемый cdll.LoadLibrary().Вам нужно будет смоделировать структуру z_stream, расширив ctypes.Structure.

Частичный пример, который должен помочь вам:

from ctypes import *

class z_stream(Structure):

    _fields_ = [
        ('next_in', c_char_p),
        ('avail_in', c_uint),
        ('total_in', c_ulong),
        # finish adding all fields in the z_stream struct..
        ]

stream = z_stream()

zlib = cdll.LoadLibrary('./zlib-1.2.5/libz.so.1')
ret = zlib.deflateInit_(stream, 1, "1.2.5", sizeof(stream))
print ret
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...