6.5 Faire le pont avec Python - naver/lispe GitHub Wiki

Python

English Version

LispE fournit un pont avec Python 3 à travers une bibliothèque dynamique spécifique : pylispe.

Cette bibliothèque agit comme une bibliothèque à double sens. En d'autres termes :

  • vous pouvez exécuter du code LispE dans un programme Python
  • Vous pouvez exécuter du code Python dans un programme LispE.

Compilation

Pour compiler la bonne version de pylispe.so sur votre machine, vous devez d'abord exécuter : python checklib.py.

Cette commande va explorer votre répertoire de bibliothèques pour trouver l'installation actuelle de Python 3 sur votre machine.

Si aucune installation n'est trouvée, vous pouvez toujours jeter un oeil à Makefile.in, qui peut contenir les lignes suivantes :

INCLUDEPYTHON = -I/usr/include
PYTHONLIB = /usr/lib64/python3

Les chemins /usr/include et /usr/lib64/python3 sont donnés à titre d'exemple. Si ces chemins ne correspondent pas à votre installation actuelle, vous pouvez les modifier pour vous connecter à votre propre version de Python3.

Pour compiler cette version, allez dans le répertoire suivant : pythonlispe et exécutez make all

Exécuter du code LispE en Python

La bibliothèque pylispe expose les méthodes Python suivantes :


import pylispe

lisp = pylispe.lisp() # cette méthode crée un interpréteur LispE

# cette méthode charge un programme LispE
lisp.load(filename) 

# cette méthode évalue un programme LispE donné sous forme de chaîne de caractères
lisp.eval('...') 

# cette méthode exécute une fonction LispE avec p1...p2 comme paramètres.
r = lisp.execute("function", p1, p2...) 

Important: puisque LispE fait la distinction entre les atomes et les chaînes de caractères, les chaînes de caractères doivent être fournies avec des guillemets doubles à l'intérieur : '"chaîne de caractères"'. Cependant, si cette chaîne contient des caractères non alphabétiques, elle est automatiquement considérée comme une chaîne et non comme un atome :

Exemple


r = lisp.execute("function", "a", '"a"', 'ceci est un test')

"function" est un atome
"a" est un atome
'"a"" est une chaîne de caractères
'ceci est un test' ne peut pas être un atome et est donc une chaîne de caractères

Exemple

D'abord le code LispE :

; Voici d'abord le code qui sera chargé dans Python : called_in_python.lisp 

(defun mult(x y) (* x y))

(defun add(x y) (+ x y))

Puis le code Python :

# Ce code exécute du code LispE dans Python

import pylispe

# nous créons un interpréteur lisp
a=pylispe.lisp()

# Nous chargeons le fichier courant

print(a.load("called_in_python.lisp"))

# une évaluation
print(a.eval("(setq d 10)")))


# Nous pouvons appeler directement une instruction ou un opérateur
# Notez la structure "..." pour passer des chaînes à LispE, alors que les atomes sont passés comme de simples chaînes.
# les atomes sont transmis comme de simples chaînes de caractères : le 'd' est l'atome
# qui a été créé ci-dessus dans l'instruction 'setq'.
print(a.execute("+", '"test"', 'd'))

# Nous pouvons également utiliser la fonction add qui a été implémentée dans called.lisp.
# Le 'd' est à nouveau celui qui a été déclaré ci-dessus avec la valeur 10


print(a.execute("add", "d", 31.654))

Exécuter du code Python en LispE

La bibliothèque pylispe expose les instructions LispE suivantes :


; Comment charger la bibliothèque 
; (n'oubliez pas de mettre : LISPEPATH au chemin réel où se trouve la bibliothèque)
(use "pylispe")

La bibliothèque LISPEPATH ; crée un interpréteur Python à travers lequel toutes les interactions
; avec Python seront traitées.
; NOTEZ QUE NOUS STOCKS CET INTERPRÈTEUR DANS UNE VARIABLE : py, 
; que nous utilisons dans le reste des instructions. 
; Bien sûr, 'py' est donné ici à titre d'exemple...
(setq py (python)) 

; exécute du code Python
(python_run py code) 

; ajoute un chemin d'accès à la liste des chemins d'accès valides aux bibliothèques Python
(python_setpath py path) 

; charge une bibliothèque Python
(python_import py filename) 

; exécute une fonction avec une liste d'arguments.
(python_execute py funcname arguments) 

Chargement et exécution du code Python

Voici un exemple de la façon dont Python peut être exécuté à partir de LispE

Tout d'abord, notre code Python :


# Une fonction simple

def testing(i) :
   return i+10

Puis notre code LispE :

(use 'pylispe)

; nous créons un interpréteur python
(setq py (python))

; Nous définissons un chemin vers le répertoire courant
; où se trouve notre programme Python...
; _current est le répertoire où ce programme LispE est stocké
(python_setpath py _current)

;Nous chargeons un programme Python
(python_import py "called_in_lispe")

;On exécute la fonction chargée avec le programme
(println (python_execute py "testing" '(20)))

Exemple 2

Cet autre exemple montre comment python_run est utilisé :

(use 'pylispe)

; nous créons un interpréteur python
(setq py (python))

; Nous exécutons du code
(python_run py "i = 100 + 20")
(python_run py "print('Within:',i)")

; Nous définissons une fonction Python
; comme une chaîne LispE
(setq myFunc
`def toto(i) :
   return i+10 ;
`
)

; nous stockons notre définition de fonction
(python_run py myFunc)

; que nous pouvons exécuter et en extraire un résultat
(println (python_execute py "toto" '(21)))

; Une autre façon de procéder est d'utiliser une macro :
(defmacro toto(v) (python_execute py "toto" (list v)))

(println (toto 21))