gpt4 book ai didi

python - 使用与系统使用 Python cdll import 不同的 zlib.so 版本

转载 作者:太空宇宙 更新时间:2023-11-04 04:06:46 25 4
gpt4 key购买 nike

问候,

我正在尝试修改 zlib 和测试行为,所以我编写了 mylib.cmylib.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 版本,所以我从源代码下载并编译了一个不同的版本(将它安装在我的系统上使它不稳定)。我现在面临的问题是,在 python 中使用 mylib 时,不会反射(reflect)自定义编译的 zlib 源文件中的更改。 Python(或者可能是我编译 mylib.so 的方法)必须使用系统版本的 zlib。有什么方法可以指定 zlib.so 的“正确”版本。

最佳答案

我相信 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 包装在共享对象中是行不通的。您需要做的是通过 cdll.LoadLibrary() 返回的共享对象句柄直接调用您的自定义 zlib 函数。您需要通过扩展 ctypes.Structure 来模拟一个 z_stream 结构。

应该让你继续的部分例子:

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

关于python - 使用与系统使用 Python cdll import 不同的 zlib.so 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5194092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com