Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Interfaçage autre langage
Interfaçage autre langage Forum d'entraide pour l'interfaçage avec d'autres langages (ctypes, api C, swig, ...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/10/2011, 17h17   #1
the-atlantis
Invité de passage
 
Inscription : février 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 2
Points : 0
Points : 0
Par défaut utiliser une librairie partager 32bits sur python 64

Bonjour,

j'ai créer une librairie en c++ que j'ai partagé via Swig.
je l'utilise sans problème sur une architecture 32 bits.

je voudrai pouvoir utiliser ma librairie dans mon architecture 64 bits.
la contrainte étant que ma librairie utilise des modules .so qui sont 32 bits et ne peuvent être compiler en 64.


Est-ce possible ? Comment ?

voici ce que j’utilise (version allégé) pour la création de ma lib partagé :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
# Création de la librairie partager Python
ar rcs obj/linuxrel/libeconf.a obj/linuxrel/econf.o
 
 
echo '/* econf.i */ 
%module econf
%{
#include "../../econf.h"
%}
%include "../../econf.h"' > obj/linuxrel/econf.i 
 
swig -python -c++ obj/linuxrel/econf.i 
 
g++ -m32 -c -fPIC -I/usr/include/python2.6 \
-I/usr/easyvalid/tools/Econf/Framework/framework_sdk_v1.4.7/include obj/linuxrel/econf_wrap.cxx 
 
g++ -m32 -O3 -shared -L/usr/easyvalid/tools/Econf/Framework/framework_sdk_v1.4.7/bin -Lobj/linuxrel/ -lpython2.6 -Wl,-soname,_econf.so econf_wrap.o -leconf -lsndfile -lm -ldl -lpthread -lrt -o obj/linuxrel/_econf.so
lors de l'import depuis python 64 j'obtient :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
[easyvalid@EasyValid linuxrel]$ python -m econf
Traceback (most recent call last):
  File "/usr/lib64/python2.6/runpy.py", line 122, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib64/python2.6/runpy.py", line 34, in _run_code
    exec code in run_globals
  File "/usr/easyvalid/tools/Econf/Convert/obj/linuxrel/econf.py", line 25, in <module>
    _econf = swig_import_helper()
  File "/usr/easyvalid/tools/Econf/Convert/obj/linuxrel/econf.py", line 21, in swig_import_helper
    _mod = imp.load_module('_econf', fp, pathname, description)
ImportError: /usr/easyvalid/tools/Econf/Convert/obj/linuxrel/_econf.so: wrong ELF class: ELFCLASS32
the-atlantis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 18h02   #2
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 739
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 739
Points : 4 581
Points : 4 581
Salut,

L'erreur:
"ImportError: /usr/easyvalid/tools/Econf/Convert/obj/linuxrel/_econf.so: wrong ELF class: ELFCLASS32"
est "systeme"....

Comme l'espace d'adressage que l'OS propose à une bibliothèque 32 bits est sensiblement différent d'un 64 bits, je ne doute qu'un "OS" supporte un tel mélange - c'est compliqué... et il y a des solutions de contournement "possible" au niveau application qui en réduisent l'intérêt.
Dans votre cas, la solution pourrait être d'installer un Python 32 bits dans un OS 64 bits... Si vous voulez absolument profiter d'un espace d'adressage 64bits et de l'ancienne bibliothèque, il devrait être "possible" d'interfacer les deux via un IPC quelconque (un process 64 bits qui cause avec un process 32 bits de façon plus ou moins proche).

- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 10h08   #3
the-atlantis
Invité de passage
 
Inscription : février 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 2
Points : 0
Points : 0
Merci @wiztricks pour votre réponse.

Mon problème est que le programme python qui va importer la librairie "econf" est en 64 bits et utilise massivement le multithreading (au delà de la limite de 302 thread système en mode 32 bits), il me faut donc trouver une solution qui me permet d'importé cette lib 32 dans mon programme 64.

Existe t'il une "passerelle" 64->32 ?

###### ######
# P64 # --> passerelle --> # lib 32#
###### ######

Merci
the-atlantis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 13h01   #4
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 739
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 739
Points : 4 581
Points : 4 581
Salut,

Citation:
Envoyé par the-atlantis Voir le message
Existe t'il une "passerelle" 64->32 ?i
On peut toujours faire une "passerelle", la question est de savoir si on pourra se contenter d'un pont en corde qui sera traversé de temps en temps par des humains ou s'il faut un truc genre aqueduc de Millau devant supporter le passage de XX tonnes.

Ce sera un dialogue entre deux processus ou entre threads de processus différents. Ce sera donc "context switch" et "transferts de messages"... qui pourront être pénalisants côté temps de réponse.

Après c'est du Python32 <-> Python64 ou du Python64 - DLL64bits <-> Process 32 bits.
- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h22.


 
 
 
 
Partenaires

Hébergement Web