Embarquer Python!

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Embarquer Python!

Message par nico »

Cet exemple montre une utilisation du langage Python dans une application PureBasic. Comme à mon habitude, il n'y a pas d'explication claire donc il vaut mieux avoir une petite connaissance de Python pour apprécier ce code (moi-même je ne connais que le strict minimum) qui est une traduction d'un code en c écrit par Jun Du dans un article du site de Code Project. Merci à lui. :)

Python (projet open source) est un interpréteur multi os très puissant permettant la programmation procédurale ou objet.

Site officiel de Python:
http://www.python.org/

Livre en français au format informatique à télécharger pour apprendre à programmer en Python:
http://www.ulg.ac.be/cifen/inforef/swi/python.htm

Bien sûr, il vous faudra installer Python pour essayer ce code, quoi que seul la dll soit nécessaire dans cet exemple puisque il n'y a pas d'importation de module externe.

L' exemple suivant exécute une fonction, ici une multiplication avec deux arguments et retourne la valeur que Pb récupère.

Le code Purebasic:

Code : Tout sélectionner

Global  *pName, *pModule, *pDict, *pFunc, *pValue

Fichier.s="py_function" ;le fichier python sans extension
fonction.s="multiply"
valeur_1.l=12
valeur_2.l=10

; Ce code fait référence à l'article publié par Jun Du
; qui montre par des exemples comment embarquer Python
; dans un autre programme

OpenConsole()
     OpenLibrary(0,"python24.dll")

     ;// Initialize the Python Interpreter
     CallFunction(0,"Py_Initialize")
     
     ;// Build the name object
     ;MessageRequester("Info",GetArgV(1))
     *pName = CallFunction(0,"PyString_FromString",Fichier)
     
     ;// Load the module object
     *pModule = CallFunction(0,"PyImport_Import",*pName)
     
     ;// pDict is a borrowed reference 
     *pDict = CallFunction(0,"PyModule_GetDict",*pModule)
     
     ;// pFunc is also a borrowed reference
     *pFunc = CallFunction(0,"PyDict_GetItemString",*pDict, fonction)
     
     *pArgs = CallFunction(0,"PyTuple_New",2)
     
     *pValue = CallFunction(0,"PyInt_FromLong",valeur_1)
     CallFunction(0,"PyTuple_SetItem",*pArgs, 0, *pValue)
     CallFunction(0,"Py_DECREF",*pValue) 
     
     *pValue = CallFunction(0,"PyInt_FromLong",valeur_2)
     CallFunction(0,"PyTuple_SetItem",*pArgs, 1, *pValue)
     CallFunction(0,"Py_DECREF",*pValue) 
     
     If CallFunction(0,"PyCallable_Check",*pFunc) 
          *pValue = CallFunction(0,"PyObject_CallObject",*pFunc, *pArgs)
     Else 
          CallFunction(0,"PyErr_Print")
     EndIf 
     
     PrintN("")
     PrintN(Str(CallFunction(0,"PyInt_AsLong",*pValue)))
     
     CallFunction(0,"Py_DECREF",*pArgs)     
     CallFunction(0,"Py_DECREF",*pValue)
     
     ;// Clean up
     CallFunction(0,"Py_DECREF",*pModule)
     CallFunction(0,"Py_DECREF",*pName)
     
     ;// Finish the Python Interpreter
     CallFunction(0,"Py_Finalize")

     Chaine$ = Input()

     CloseLibrary(0)
CloseConsole()     



Le script Python avec pour nom py_function.py et à mettre sous le même répertoire que l'exe:

Code : Tout sélectionner

'''py_function.py - Python source designed to '''
'''demonstrate the use of python embedding'''

def multiply(a,b):
    c = a*b
    print 'The result of a x b :', c
    return c
:)

Si quelques un d'entres vous, avez essayé ce code, faites le moi savoir!
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

Interessant :)

j'ai telecharge le livre ainsi que les exemples, dommage cependant que le language sur le site officiel fasse plus de 9 mo trop long a telecharger en ce qui me concerne, cela dit python est un language interpreté tres interessant et tres puissant, j'ai meme vu sur quelques sites des modules de toutes sortes 3d, base de donnee, acces reseau...

helas pas de compilateur exe en vue :(
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je te donne un lien pour télécharger la Dll (1.78 Mo):

http://home.tele2.fr/purebasic/python24.dll


Essayes! :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'ai une erreur invalid memory access à cette ligne
*pDict = CallFunction(0,"PyModule_GetDict",*pModule)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Voici le lien du programme compilé ainsi que le script python:

http://home.tele2.fr/purebasic/python3.exe

http://home.tele2.fr/purebasic/py_function.py

Si avec les fichiers originaux, ça ne fonctionne pas; c'est qu'il doit falloir autre chose que la dll.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ça fonctionne avec l'exe

et je viens de refaire un test avec le code , ça fonctionne cette fois ci , j'ai écrasé le fichier script avec le tien , c'est la seule différence par rapport à mon précédent essai
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ok je viens de comprendre mon erreur , j'avais généré le fichier script à partir de l'IDE de purebasic, le problème c'est qu'il ajoute des caractères à la fin , et je n'y pensais plus :oops:

J'ai refais le fichier avec notepad , ça fonctionne cette fois ci :)

Sympa le truc , merci Nico
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Parfait. :)

Python est particulier dans le sens où il n'y a pas de fin d'instruction par exemple pour if-endif; endif n'existe pas c'est l'indentation qui marque la fin; d'où l'importance de l'indentation.

Sinon je viens de voir dans le header de la dll que la dll msvcr71.dll (runtime library de microsoft) était inscrite donc il se peut qu'elle en est besoin dans des cas particuliers.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Ca ne fonctionne pas chez moi :-?
En fait la dll ne se charge pas (j'ai mi un debug devant le OpenLibrary)

Dri
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

il y a quelques temps j'avais installé python 2.4 , peut-être que je n'ai pas eu de problème grâce à ça ? :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Essayes en mettant le chemin complet pour la dll.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

bah j'ai déjà essayé... et même en la mettat dans un des dossier de la variable %PATH% ca ne change rien

Dri :(
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Il n'y a aucune raison que la dll ne se charge pas!
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Chez moi cela marche, mais j'ai dû mettre en plus la Dll dans le même dossier que les corps de programme (sinon plantage)

le résultat est 120 :lol:


mais j'ai aussi ce message en 1ère ligne

'Import site failed' : use -v for traceback
120 result of a x b : 120
:?: :?: :?:
Est beau ce qui plaît sans concept :)
Speedy Galerie
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

Meme chose...

Bizarre ce message : 'Import site failed' : use -v for traceback

Pour executer avec l'ide de purebasic, transferer la dll et la fonction python dans le rep compilers de purebasic sinon il y'a une erreur...

sinon il est possible de compiler un exe dans un rep et d'y mettre egallement la dll et la fonction python...

Marrant que ca marche :), il serait probablement possible d'aller plus loin, le language python offre beaucoup de possibilite, mais on perd les avantages de purebasic rapidite et legerete de l'exe (la dll fait quand meme env 1800 ko)...
Répondre