09 décembre 2021
publié par 

WINDEV et WEBDEV 27 permettent d'appeler directement depuis un code en WLangage une procédure Python. Il s'agit de la nouveauté 137.

 

La méthode est simplifiée à l'extrême grâce à la possibilité d'importer les modules Python (*.PY) avec l'explorateur de projet.

 

Voici un tuto de toutes les étapes pour exécuter un code Python :

 

  • Installer Python, en sélectionnant le bon mode de compilation 32 / 64 bits...
    • Si l'éditeur de WINDEV et l'application développée sont en 64 bits, il faut uniquement Python en 64 bits.
    • Si par exemple WINDEV est en 64 bits mais que l'application développée a encore une version en 32 bits, il faudra installer
      • une version 32 bits de Python qui servira pour le mode test Go et l'exécutable,
      • et une version 64 bits pour l'éditeur.

        C'est la contrainte Windows habituelle pour le chargement de DLL par un processus : pas de croisement possible du mode de compilation (comme pour chargement du client d'une base de données, les connecteurs natifs, les ActiveX ou les DLL système...).
  • Renseigner dans la configuration de WINDEV l'emplacement de la DLL Python :
    • volet "Accueil" du ruban,
    • bouton "Options", puis "Options générales" de WINDEV,
    • volet "Répertoires",
    • renseigner l'emplacement de la DLL python*.dll
  • Importer dans l'explorateur de projet le module Python contenant les fonctions à utiliser.
    Cela revient à sélectionner un module ".py" sur disque :



    Exemple avec l'importation d'un module nommé MonModulePython.py contenant les fonctions "Hello" et "python_version" :



    Le module "MonModulePython" de cet exemple peut être généré en WLangage avec ce code :

     

    sCodeModulePython est une chaîne ANSI = [
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    import sys
    #import json
    def python_version():
    return f"Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro} {'64' if sys.maxsize > 2**32 else '32'}-bit"
    def Hello():
    return f"Hello World !"
    ]
    fSauveTexte(fRepDonnées()+[fSep]+"MonModulePython.py",ChaîneVersUTF8(sCodeModulePython))

     

    Grâce à cette importation les fonctions Python seront reconnues par la compilation dans l'éditeur de code.

  • Indiquer dans le code de l'application où se trouve l'emplacement de Python pour l'exécution.
    L'emplacement doit être donné par la fonction PythonInitialise avant le premier appel d'une fonction d'un module Python :

    // Chemin à rendre paramétrable et/ou à récupérer sur le poste cible
    PythonInitialise("D:\Python39\python39.dll")

C'est terminé ! Il suffit d'appeler les fonctions du module Python comme s'il s'agissait de fonctions de vos collections de procédures en WLangage :

 

Trace(python_version())
Trace(Hello()) // le nom seul suffit
Trace(MonModulePython.Hello()) // le nom peut être préfixé du module en cas d'ambiguité

 

 

A noter que l'importation dans le projet n'est pas obligatoire. Les fonctions PythonAjouteChemin et PythonExécute permettent d'appeler les fonctions d'un module qui n'est pas intégré dans le projet. Dans l'exemple ci-dessus, la fonction "Hello" peut être appelée sans importation dans l'explorateur de projet avec le code :

 

PythonInitialise("D:\Python39\python39.dll")
PythonAjouteChemin("D:\<dossier contenu le MonModulePython.py>")
Trace(PythonExecute("MonModulePython","Hello")) // ici c'est uniquement le nom du module sans l'extension .py

 

Attention :

  • L'exécutable déployé doit avoir les modules .py accessibles sur disque dans son dossier, ou l'emplacement donné par la fonction PythonAjouteChemin. Les modules .py ne peuvent pas être trouvés s'ils sont intégrés à la bibliothèque de l'exécutable. En fonction du type de déploiement ou de la nature du code, il peut être nécessaire de vérifier le module avant d'exécuter ses fonctions :
  • Python fait la différence entre les majuscules et les minuscules ("case-sensitive"). Le nom du module et de la fonction doivent donc respecter la casse.

 

Liens utiles sur le sujet :

 

< Retour

2 commentaires

phd
30/12/2021 - 11:15 - Répondre
En fonction du type de déploiement ou de la nature du code, il peut être nécessaire de vérifier le module avant d'exécuter ses fonctions : contrôler un hash des modules .py, (pas si évident ) <> La méthode est simplifiée à l'extrême ......

Guillaume BAYLE
31/12/2021 - 09:51 - Répondre
Bonjour, le sujet sera détaillé dans un exemple LST. Une demande afin d'autoriser l'exécution d'un module .py intégré à l'exécutable a également été faite à l'équipe développement. A suite ! Bons développements !

Publier un commentaire : 
Votre adresse email ne sera pas publiée