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 29/11/2012, 20h26   #1
padawanpython
Invité de passage
 
Homme
Ingénieur
Inscription : juillet 2012
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2012
Messages : 3
Points : 2
Points : 2
Par défaut Interface Python/C++ que choisir ? vos avis svp

Bonsoir

Je poste ce message car je cherche m'exercer dans l'interfaçage Python/C++ et je voudrais avoir vos avis sur l'outil "optimal" à utiliser.

J'ai un peu fait joujou avec SWIG (exemple de base sur une fonction) mais en recherchant sur internet, j'ai vu qu'il existait les outils suivants:
- SWIG
- Cython
- SIP
- Boost Python

Quel est celui que vous me conseillerez d'utiliser et pourquoi ? Si vous avez eu l'occasion de vous en servir, pouvez-vous me faire part de vos retours ?

En vous remerciant
padawanpython est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 22h33   #2
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 303
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 303
Points : 1 795
Points : 1 795
Avec C++, celui ayant meilleur réputation est boost, sinon pour l'interfaçage C/python je préfère cython.

Ce qui m'a bloqué avec boost est la doc que je ne trouve pas toujours très clair.

Bref pour C++, boost est très puissant.

SWIG pour l'avoir testé, j'aime pas, pas adhérer, et je ne trouve pas très performant.

SIP pas testé, donc je n'affirme rien.
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 08h58   #3
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 766
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 766
Points : 3 034
Points : 3 034
Bonjour,

Dans la liste donnée, je ne connais que Cython, et je le trouve très intéressant. Comme il y a longtemps que je n'ai pas programmé en C/C++, j'apprécie de ne pas avoir à le faire...

Un des avantages que j'y vois, c'est qu'en utilisant la solution "décorateur", on peut accélérer des fonctions Python sans modifier leur code.

Si on accepte de programmer en Python en visant Cython, on peut utiliser directement les fonctions de la bibliothèque C (la doc parle aussi de C++). Par exemple, pour utiliser la fonction exp dans une fonction compilée Cython, il suffira de la définir comme suit:

Code :
1
2
cdef extern from "math.h": 
    double exp(double x)
A noter tout de même que le gain en rapidité dépend de la "proximité" du codage Python par rapport au C. Par exemple, si on utilise à fond les structures de données Python qui n'existent pas en C (le "long" de Python par exemple), on oblige le code compilé à faire appel en permanence à l'API Python, ce qui fait qu'on ne gagne plus rien.

Prenons un exemple: une fonction Python qui calcule e à la puissance x en passant par les séries.

1- version en pur Python:

Code :
1
2
3
4
5
6
7
8
def expo1(x, eps=1e-15):
    """calcul de e puissance x par les séries"""
    n, t, s = 0, 1.0, 1.0
    while t/s>eps:
        n += 1
        t = t*x/n
        s = s + t
    return s
2- version en Cython avec la solution "décorateur" => dans un fichier séparé appelé ici "test01bib.pyx" :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
from cython import cclass, ccall, cfunc, returns as creturns, locals as clocals
#############################################################################
@ccall
@creturns(double)
@clocals(x=double, eps=double, n=int, t=double, s=double)
def expo2(x, eps=1e-15):
    """calcul de e puissance x par les séries"""
    n, t, s = 0, 1.0, 1.0
    while t/s>eps:
        n += 1
        t = t*x/n
        s = s + t
    return s
le décorateur "ccall" indique le type de fonction. Ici, ce sera une fonction qu'on pourra appeler à partir du C et à partir du Python. Il y a d'autres types: "cclass" pour une classe et "cfunc" pour appel uniquement à partir du C.

Le reste est évident: on précise les types de données utilisées pour que le compilateur C sache quoi faire.

On compile avec (ce qui fabrique "test01bib.pxd"):

Code :
python setup.py build_ext --inplace
Avec un setup.py qui contient (NB: pas de caractères accentués, même dans les commentaires!):

Code :
1
2
3
4
5
6
7
8
9
10
11
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
 
ext_modules = [Extension("test01bib", ["test01bib.pyx"])]
 
setup(
  name = 'bibliotheque',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)
Et on importe cette fonction compilée avec (elle sera extraite directement de "test01bib.pyd"):

Code :
from test01bib import expo2
Voilà. On peut maintenant faire des essais pour comparer la solution en pur Python avec la solution Cython: avec 1 million de valeurs au hasard, la solution Cython est 10 fois plus rapide que la solution Python!

Bonus: sous Windows, comme j'ai Visual C, Cython le prend par défaut. Quand je veux qu'il utilise plutôt mingw32, je place dans le même répertoire un fichier texte appelé "setup.cfg" contenant:

Code :
1
2
[build]
compiler = mingw32


[Edit] J'ai dit plus haut qu'on pouvait utiliser directement les fonctions de bibliothèques C/C++. Cela veut dire qu'on peut créer facilement en Python compilé par Cython, une interface pour utiliser des bibliothèques C/C++ et les appeler directement à partir du code en pur Python. Par exemple:

Code :
1
2
3
4
5
6
7
8
9
10
cdef extern from "math.h": 
    double exp(double x)
 
#############################################################################
@ccall # pour appel possible par du C ou par du Python
@creturns(double)
@clocals(x=double)
def exp2(x):
    """calcul de e puissance x par la bibliothèque C """
    return exp(x)
Une fois compilé par Cython, ce code permettra à un programme en pur Python, après une simple importation, d'appeler exp2 qui appellera directement le exp de la bibliothèque C.
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 18h42   #4
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 303
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 303
Points : 1 795
Points : 1 795
Salut Tyrtamos,

Si t'as une solution pour faire tourner du code C++ avec cython, je veux bien, du genre utiliser une fonction externe d'une bibliothèque créée en C++ dans un fichier de type pyx, je signe

Sinon le C, ça passe nickel avec cython.

Pour le C++, je suis très embêté...
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 19h33   #5
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 766
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 766
Points : 3 034
Points : 3 034
Bonjour fred1599,

J'ai vu seulement que le sujet était abordé assez longuement dans la doc (http://wiki.cython.org/WrappingCPlusPlus).

Il y a de plus un exemple qu'on peut télécharger (http://wiki.cython.org/WrappingCPlus...=cythoncpp.tgz), et qui parait assez simple.

Si tu es dans le bain du C++: essaie, et dis si ça marche! Ça m'intéresse, mais je n'ai pas touché au C++ depuis pas mal de temps (2005) et j'ai "des trous dans mes lacunes"
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 20h28   #6
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 303
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 303
Points : 1 795
Points : 1 795
Eh bien écoute rien à faire

Voici mon code C++, rien de plus simple

test.cpp

Code :
1
2
3
4
5
6
#include <iostream>
 
int add(int a, int b)
{
    return a+b;
}
test.h

Code :
1
2
3
4
5
6
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
 
int add(int a, int b);
 
#endif
addition.pyx

Code :
1
2
3
4
5
6
7
8
9
cdef extern from "test.h":
    cdef int add(int, int)
 
 
cpdef ajouter(a, b):
    cdef int val_1 = a
    cdef int val_2 = b
    cdef int result = add(val_1, val_2)
    return result
Code :
cython addition.pyx --cplus
Mon addition.cpp sort sans problème...

setup.py

Code :
1
2
3
4
5
6
7
8
9
10
11
from distutils.core import setup, Extension
 
ext = Extension(
    "ajout", ["addition.pyx"],
    language="c++",
    include_dirs=["/home/fred1599/Desktop"],
    libraries=['test'],
    extra_link_args=[],
    )
 
setup (ext_modules = [Extension('test', ['test.cpp'])],)
Fonctionne bien comme ci-dessous, mais même message d'erreur après l'import de la lib.

Résultat

Code :
g++ addition.cpp -o addition.so -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing $(pkg-config python --cflags)
La compilation se passe bien, mais au niveau de l'import

Code :
1
2
3
4
>>> import addition
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./addition.so: undefined symbol: _Z3addii
Du coup si j'arrive à faire fonctionner ce petit code, ça roulera pour moi, mais rien à faire, alors qu'en C ça va tout seul.
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 20h54   #7
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 766
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 766
Points : 3 034
Points : 3 034
As-tu essayé l'exemple à télécharger?
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 21h01   #8
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 303
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 303
Points : 1 795
Points : 1 795
Non je vais regarder
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 21h13   #9
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 303
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 303
Points : 1 795
Points : 1 795
J'ai fais quelques modifs, j'ai utilisé un autre setup.py et regardé le makefile, mais rien à faire, j'ai toujours la même erreur lors de l'importation.
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 21h37   #10
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 766
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 766
Points : 3 034
Points : 3 034
Pour que le code Cython dans le .pyx réussisse à appeler la fonction écrite en C++, il faut que cette fonction soit compilée/liée avant en tant que bibliothèque (et non comme un exécutable): comment fais-tu pour ça?

Peut-être faudrait-il avant essayer d'exécuter une fonction de la bibliothèque standard C++? Genre sqrt de math.h?
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 21h41   #11
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 303
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 303
Points : 1 795
Points : 1 795
Citation:
Pour que le code Cython dans le .pyx réussisse à appeler la fonction écrite en C++, il faut que cette fonction soit compilée/liée avant en tant que bibliothèque (et non comme un exécutable): comment fais-tu pour ça?
cython fichier.pyx --cplus

Citation:
Peut-être faudrait-il avant essayer d'exécuter une fonction de la bibliothèque standard C++? Genre sqrt de math.h?
C'est plutôt un standard du C, j'ai rien fais de spécial, mon code fonctionne aussi bien en C qu'en C++, si tu vires les includes, non?
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 21h51   #12
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 766
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 766
Points : 3 034
Points : 3 034
Citation:
Envoyé par fred1599 Voir le message
cython fichier.pyx --cplus
Non. Dans ton exemple perso plus haut, je parle de la compilation de test.cpp accompagné de test.h. Cela m'étonnerait que Cython s'en occupe.
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 22h04   #13
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 303
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 303
Points : 1 795
Points : 1 795
Citation:
Non. Dans ton exemple perso plus haut, je parle de la compilation de test.cpp accompagné de test.h. Cela m'étonnerait que Cython s'en occupe.
Pourquoi pour le include "test.h" manquant dans le fichier cpp? J'avais fais la modif ça ne change rien.

Ensuite j'ai remodifié pour test.cpp, j'ai fais beaucoup d'autres tests, mais sans réussite.

test.cpp

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include "test.h"
 
using namespace std;
 
#ifdef __cplusplus
extern "C" {
#endif
 
int add(int a, int b)
{
    return a+b;
}
 
#ifdef __cplusplus
}
#endif
test.h

Code :
1
2
3
4
5
6
7
8
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
 
using namespace std;
 
int add(int a, int b);
 
#endif
addition.pyx

Code :
1
2
3
4
5
6
cdef extern from "test.h":
    int add(int, int)
 
cpdef ajouter(x, y):
    cdef int result = add(x, y)
    return result
cython addition.pyx --cplus

création du fichier addition.cpp

gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -fPIC -I/usr/include/python2.7 -c /home/fred1599/Desktop/addition.cpp -o /home/fred1599/Desktop/addition.o

Pas d'erreur, cette ligne est récupérée du setup.py

addition.o créé

g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro /home/fred1599/Desktop/addition.o -o /home/fred1599/Desktop/addition.so

addition.so créé sans erreur

Utilisation de la lib avec python

Code :
1
2
3
4
>>> import addition
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./addition.so: undefined symbol: _Z3addii
Voilà toujours la même erreur
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 22h17   #14
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 766
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 766
Points : 3 034
Points : 3 034
C'est toujours non.

test.cpp + test.h ===> test.so

Tu fais comment?

Cython ne s'occupe certainement pas de compiler la bibliothèque C++ contenant les fonctions qui seront considérées comme "extern" par le code Cython.
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 22h26   #15
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 303
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 303
Points : 1 795
Points : 1 795
Citation:
Cython ne s'occupe certainement pas de compiler la bibliothèque C++ contenant les fonctions qui seront considérées comme "extern" par le code Cython.
Mouais j'ai tenté d'autres choses, donc on sait jamais, bref rien ne fonctionne de ce côté non plus.

Citation:
test.cpp + test.h ===> test.so
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -fPIC -I/usr/include/python2.7 -c test.cpp -o addition.o

Pas d'erreur

g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro addition.o -o addition.so

pas d'erreur

et ensuite?
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 22h39   #16
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 766
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 766
Points : 3 034
Points : 3 034
Avec:

Code :
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -fPIC -I/usr/include/python2.7 -c test.cpp -o addition.o
Tu envisages de compiler test.cpp en C++ avec gcc? Et que fait là addition.o?

Désolé, mais je crois qu'il y a un problème de méthode. Test.cpp doit être compilé en C++ séparément de "addition". Ceci en mode "bibliothèque", c'est à dire sans le main. Mais je ne sais plus comment on fait.
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 22h44   #17
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 303
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 303
Points : 1 795
Points : 1 795
Bon il y a du nouveau

J'ai utilisé setup.py du tuto

Code :
1
2
3
4
5
6
7
8
from distutils.core import setup
from Cython.Build import cythonize
 
setup(ext_modules = cythonize(
           "addition.pyx",                 # our Cython source
           sources=["test.cpp"],  # additional source file(s)
           language="c++",             # generate C++ code
      ))
ça me génère un fichier test.so

Maintenant quand j'import j'ai cette erreur

Code :
1
2
3
4
>>> import test
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (inittest)
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 22h56   #18
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 766
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 766
Points : 3 034
Points : 3 034
Essaie de t'inspirer de l'exemple à télécharger.

Son setup.py est:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
 
setup(
  name = 'Demos',
  ext_modules=[
    Extension("rectangle",
              sources=["rectangle.pyx", "cpp_rect.cpp"], # Note, you can link against a c++ library instead of including the source
              include_dirs=["."],
              language="c++"),
    ],
  cmdclass = {'build_ext': build_ext},
 
)
Il est donc possible de mettre test.cpp dans le setup, comme il serait aussi possible de mettre sa version compilée séparément test.so. Mais la syntaxe n'est pas la même que la tienne.
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 23h01   #19
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 303
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : juillet 2006
Messages : 1 303
Points : 1 795
Points : 1 795
J'avais déjà essayé, j'avais la même erreur après une compilation correcte, mais je crois avoir compris le principe, en fait du C++ on va recevoir un fichier de type C grâce au setup.py.

Il me semble que mon erreur se trouve dans mon fichier.pyx, car je ne prend pas en compte le "using namespace std;"

Bref je reverrais cela demain si possible.

Merci pour tout, je te tiens au courant
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 23h03   #20
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 766
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 766
Points : 3 034
Points : 3 034
Bonsoir!

On va y arriver!
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos 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 06h45.


 
 
 
 
Partenaires

Hébergement Web