2011-03-04 65 views
1

問候,使用不同版本zlib.so比系統的使用Python的cdll導入

我試圖修改的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 

然後我使用它導入到蟒蛇:

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

我需要一個版本比一個安裝在我的系統上的其他的zlib,所以我從源代碼下載並編譯了一個不同的文件(在我的系統上安裝它使其不穩定)。我現在面臨的問題是,在python中使用mylib時,未反映自定義編譯的zlib源文件中的更改。 Python(或者我編譯mylib.so的方法)必須使用系統版本的zlib。有什麼方法可以指定zlib.so的「正確」版本。

回答

1

我相信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 
+0

您在這方面是正確的,但它是我打算使用MYLIB我libz進行復制鏈接到mylib.so-作爲定製的包裝libz進行。我想保存我在其他C項目中使用的zlib的自定義用法,只是使用了python,以便我可以快速輕鬆地爲C函數編寫測試。同時編輯問題以使其更清楚。 – user17925 2011-03-04 14:01:40

相關問題