[Python] ctypes importare libreria

Massimiliano Rosi massimiliano.rosi a gmail.com
Mer 5 Lug 2017 22:47:12 CEST


Ciao a tutti,

grazie alle dritte di Gian Mario, ho risolto l'errore di importazione
libreria con python 3.6.


> ho fatto una verifica con LD_DEBUG=files e lanciato il comando
>
>
> PYTHON2: /mnt/nand/python2.7/bin/python -c "import ctypes as c; libpack =
> c.CDLL('/mnt/nor/libpack.so', mode=c.RTLD_GLOBAL)"
> PYTHON3: /mnt/nand/python3.6/bin/python -c "import ctypes as c; libpack =
> c.CDLL('/mnt/nor/libpack.so', mode=c.RTLD_GLOBAL)"
>
> e le differenze sono su 3 librerie che in python3 non vengono caricate,
> come da dettaglio seguente (output del comando con python 2.7):
>
> Python 2.7 Quelle che seguono sono le librerie caricate da python2.7 ma
non da python3.6

> [...]
>     24305: file=libssl.so.1.0.0 [0];  needed by
> /mnt/nand/python2.7/bin/python [0]
>      24305: file=libssl.so.1.0.0 [0];  generating link map
>      24305:  dynamic: 0x400f1980  base: 0x400a3000   size: 0x00051d6c
>      24305:    entry: 0x400b1138  phdr: 0x400a3034  phnum:          5
>      24305:
>      24305:
>      24305: file=libcrypto.so.1.0.0 [0];  needed by
> /mnt/nand/python2.7/bin/python [0]
>      24305: file=libcrypto.so.1.0.0 [0];  generating link map
>      24305:  dynamic: 0x40344378  base: 0x401f6000   size: 0x0015774c
>      24305:    entry: 0x40230b4c  phdr: 0x401f6034  phnum:          5
>      24305:
>      24305:
>      24305: file=libz.so.1 [0];  needed by /mnt/nand/python2.7/bin/python
> [0]
>      24305: file=libz.so.1 [0];  generating link map
>      24305:  dynamic: 0x4036b4e0  base: 0x4034e000   size: 0x0001d6fc
>      24305:    entry: 0x4034f790  phdr: 0x4034e034  phnum:          5
> [...]
>
> e quindi con LD_DEBUG=symbols ho verificato che proprio una di queste
> contiene il symbol inflateEnd che genera l'errore:
>
> python2
> [...]
>      24749: symbol=syslog;  lookup in file=/lib/libc.so.6 [0]
>      24749: symbol=inflateEnd;  lookup in file=/mnt/nand/python2.7/bin/python
> [0]
>      24749: symbol=inflateEnd;  lookup in file=/lib/libpthread.so.0 [0]
>      24749: symbol=inflateEnd;  lookup in file=/lib/libdl.so.2 [0]
>      24749: symbol=inflateEnd;  lookup in file=/lib/libutil.so.1 [0]
>      24749: symbol=inflateEnd;  lookup in file=/lib/libssl.so.1.0.0 [0]
>      24749: symbol=inflateEnd;  lookup in file=/lib/libcrypto.so.1.0.0 [0]
>      24749: symbol=inflateEnd;  lookup in file=/lib/libz.so.1 [0]
>      24749: symbol=__gmon_start__;  lookup in
> file=/mnt/nand/python2.7/bin/python [0]
>      24749: symbol=__gmon_start__;  lookup in file=/lib/libpthread.so.0
> [0]
> [...]
>
> python3
> [...]
>      24638: symbol=syslog;  lookup in file=/lib/libc.so.6 [0]
>      24638: symbol=inflateEnd;  lookup in file=/mnt/nand/python3.6/bin/python
> [0]
>      24638: symbol=inflateEnd;  lookup in file=/lib/libpthread.so.0 [0]
>      24638: symbol=inflateEnd;  lookup in file=/lib/libdl.so.2 [0]
>      24638: symbol=inflateEnd;  lookup in file=/lib/libutil.so.1 [0]
>      24638: symbol=inflateEnd;  lookup in file=/lib/librt.so.1 [0]
>      24638: symbol=inflateEnd;  lookup in file=/lib/libm.so.6 [0]
>      24638: symbol=inflateEnd;  lookup in file=/lib/libgcc_s.so.1 [0]
>      24638: symbol=inflateEnd;  lookup in file=/lib/libc.so.6 [0]
>      24638: symbol=inflateEnd;  lookup in file=/lib/ld-linux.so.3 [0]
>      24638: symbol=inflateEnd;  lookup in file=/mnt/nor/libpack.so [0]
>      24638: symbol=inflateEnd;  lookup in file=/lib/libgcc_s.so.1 [0]
>      24638: symbol=inflateEnd;  lookup in file=/lib/libc.so.6 [0]
>      24638: symbol=inflateEnd;  lookup in file=/lib/ld-linux.so.3 [0]
>      24638: /mnt/nor/libpack.so: error: symbol lookup error: undefined
> symbol: inflateEnd (fatal)
>      24638: symbol=__dcgettext;  lookup in file=/mnt/nand/python3.6/bin/python
> [0]
>      24638: symbol=__dcgettext;  lookup in file=/lib/libpthread.so.0 [0]
> [...]
>
>
Poi facendo una ricerca online, ho capito che posso forzare il caricamento
della libreria mancante:

Python 3.6.0 (default, Feb 20 2017, 16:41:12)
>>> import ctypes as c
>>> c.CDLL('libz.so.1', mode=ctypes.RTLD_GLOBAL)
>>> libpack=c.CDLL('/mnt/nor/libpack.so')

così non viene più generato l'errore.
In realtà ho risolto ma non ho capito perché alcune librerie sono caricate
come prerequisito da python 2.7 ma non da python 3.6, vedrò di indagare e
riporterò alla lista.

Grazie a tutti.

M.





-- 

*"A parte l'uomo, tutti gli animali sanno che lo scopo principale della
vita è godersela"*
*Samuel Butler*
--
*rosi::LAB di Ro**si Massimiliano*
Mobile: +39 328.3065575
Fax: +39 178.2280639
E-mail: massimiliano.rosi a gmail.com
Pec: massimiliano.rosi a pec.it
Skype: papipano
LinkedIn: Massimiliano Rosi

----------------
"Avvertenze ai sensi del D.Lgs.196 del 30/06/2003
Le informazioni contenute in questo messaggio di posta elettronica
e/o files allegati, sono da considerarsi strettamente riservati.
Il loro utilizzo è consentito esclusivamente al destinatario del
messaggio, per le finalità indicate nello stesso.
Costituisce violazione ai principi dettati dal D.Lgs. 196/2003:
trattenere il messaggio stesso, divulgarlo anche in parte, distribuirlo
ad altri soggetti, copiarlo o utilizzarlo per finalità diverse.
Qualora riceveste questo messaggio senza esserne il destinatario
Vi preghiamo cortesemente di darcene notizia via e-mail
e di procedere alla distruzione del messaggio stesso,
cancellandolo dal Vostro sistema.
Grazie."
----------------
Nota: per proteggere il computer dai virus, le applicazioni di posta
elettronica impediscono l'invio o la ricezione di alcuni tipi di
allegati. Per determinare la modalità di gestione degli allegati,
controllare le impostazioni di protezione della posta elettronica.
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20170705/e94d1245/attachment-0001.html>


Maggiori informazioni sulla lista Python