Bonjour à tous,

Je travaille régulièrement avec SWI-PROLOG et Python et j'ai voulu "réunir" les 2 dans une application. J'ai mis en œuvre sans problème l'exemple donné dans le module
pyswip
:
https://code.google.com/p/pyswip/ et que j'ai adapté légèrement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
from pyswip import Prolog
 
    def onTest(self):
        prolog = Prolog()
        temp = 'test.prolog'
        prolog.consult(temp)
        results = list(prolog.query("father(michael,X)"))
        X = results[0]['X']
        prolog = None
        print X
code de test.prolog :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
father(michael,john).
father(michael,gina).
J'ai cherché ensuite à faire la même chose avec DJANGO mais une exception a été levée.
Code dans views.py :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
from pyswip import Prolog
 
def onTest(request):
    prolog = Prolog()
    temp = 'test.prolog'
    prolog.consult(temp)
    results = list(prolog.query("father(michael,X)"))
    X = results[0]['X']
    prolog = None
    print X
    return HttpResponse(X)
Message dans le navigateur :
WindowsError at /planning/onTest/
exception: access violation reading 0x00000020
Request Method: GET
Request URL: http://localhost:8000/planning/onTest/
Django Version: 1.7.3
Exception Type: WindowsError
Exception Value:
exception: access violation reading 0x00000020
Exception Location: C:\Python27\lib\site-packages\pyswip\prolog.py in __call__, line 94
Python Executable: C:\Python27\python.exe
Python Version: 2.7.8
et message dans la console :
Exception AttributeError: 'swipl_qid' in <bound method _QueryWrapper.__del__ of <pyswip.prolog._QueryWrapper object at 0x037AB7D8>> ignored
Je cherche depuis un bon moment l'origine du problème afin d'essayer de le régler. Je me suis rendu compte qu'une ligne contenu dans le module -pyswip- n'était pas exécutée :
self.swipl_fid = PL_open_foreign_frame()
J'ai donc fait des recherches vers la fonction
PL_open_foreign_frame()
mais je dois avouer que c'est loin d'être évident !
Je suis donc à la recherche d'une aide me permettant de comprendre ce que fait cette fonction
PL_open_foreign_frame()
afin d'essayer de régler mon problème ...
Merci d'avance pour vos contributions éventuelles.
@+