accès aux groupes de discussion, consultation et publication d'articles, recherche de "newsgroups"...
membres, identifiez-vous
é-mail Mot de passe
nouveau ? mot de passe oublié ?
Chargement... Chargement en cours...

Groupes français belges canadiens suisses internationaux Nétiquette
Échangez opinions et commentaires dans les forums de discussion.

Liaison statique avec libpython

 [  Nouvelle Discussion Nouvelle discussion  |  Répondre au groupe Répondre au groupe  |  fr.comp.lang.python ] 

Retour : Accueil du site fr comp lang python   charte stats de ce groupe


  Sujet:   Liaison statique avec libpython  
 De: inva...@nowhere.invalid.org (Alex Marandon)
 Groupes: fr.comp.lang.python
 Date: 16. May 2008, 17:54:17
Bonjour,

Je travaille sur un petit module en C qui embarque l'interpréteur 
Python. J'arrive à lier mon code avec la bibliothèque partagée sans 
soucis particulier (en utilisant les options renvoyées par 
python2.5-config --ldflags).

Pour d'obscures raisons de compatibilité avec un logiciel propriétaire, 
j'essaie de lier mon code statiquement a la bibliothèque Python, en 
utilisant le .a qui se trouve sur ma Debian. J'ai écrit un petit 
programme de test pour vous montrer où je veux en venir :


#include <Python.h>

int main(int argc, char *argv[]) {
     if (argc < 2) return(1);
     Py_Initialize();
     PyRun_SimpleString(argv[1]);
     Py_Finalize();
     return 0;
}


Avec une liaison dynamique, tout ce passe bien:

$ make
gcc -c -Wall `python2.5-config --cflags` -o t_python.o t_python.c
gcc `python2.5-config --ldflags` -o t_python t_python.o
$ ./t_python 'print "plop"'
plop
$ ./t_python 'from datetime import datetime; print datetime.now()'
2008-05-16 16:38:24.012268

Par contre en se liant avec le .a, voici ce qui se passe:

$ gcc -Wall t_python.o /usr/lib/python2.5/config/libpython2.5.a \
-o t_python -lpthread -ldl -lutil -lm
/usr/lib/python2.5/config/libpython2.5.a(posixmodule.o): In function 
`posix_tmpnam':
(.text+0x581): warning: the use of `tmpnam_r' is dangerous, better use 
`mkstemp'
/usr/lib/python2.5/config/libpython2.5.a(posixmodule.o): In function 
`posix_tempnam':
(.text+0x66f): warning: the use of `tempnam' is dangerous, better use 
`mkstemp'

Il y a des avertissements, mais l'éxécutable a bien été généré. Par 
contre à l'éxécution :

$ ./t_python 'print "plop"'
plop
$ ./t_python 'from datetime import datetime; print datetime.now()'
Traceback (most recent call last):
   File "<string>", line 1, in <module>
ImportError: /usr/lib/python2.5/lib-dynload/datetime.so: undefined 
symbol: PyExc_IOError

Voila ou j'en suis.

Je fournis aussi le Makefile de base si vous souhaitez reproduire cela 
chez vous :

$ cat Makefile
CC=gcc
CFLAGS=-Wall `python2.5-config --cflags`
LDFLAGS=`python2.5-config --ldflags`

t_python: t_python.o
        $(CC) $(LDFLAGS) -o $@ $?

t_python.o: t_python.c
        $(CC) -c $(CFLAGS) -o $@ $?


Bravo et merci de m'avoir lu :-)


DateSujet  Auteur
01.01.
o 
Groups Explorer contact votre avis comment ça marche? rechercher un groupe suggérer un groupe abuse accueil du site   Imprimer cette page   Envoyer cette page à un(e) ami(e)