Bonjour à tous,

Mon environnement : Windows 8.1, Python 2.7.8, SWI-PROLOG 64 bits version 6.6.6, module pyswip version 0.2.3, PySide version 1.2.2, sqlalchemy version 0.6.1

Je suis en train de réaliser un petite application de planification en Python qui utilise une routine en Prolog.
J'ai opté pour pyswip qui m'a l'air bien adapté. J'ai, par contre, un comportement bizarre lors du retour depuis Prolog.
Dans l'application Python, j'ai plusieurs traitements possibles dont celui qui utilise Prolog. Quand je lance la routine Python/Prolog directement depuis l'ouverture de l'application :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
        ...
        self.mainW.statusBar().showMessage(u"Préparation traitement - Séquences")
        itmm = self.session.query(Item)
        dictR = {}
        lS0 = list(iterateur3())
        lD = 'datL(' + str(lD0) + ').\n'
        lS = 'seqL(' + str(lS0) + ').\n'
        lM = 'maxL(' + str(int(self.dureeMax.value())) + ').\n'
        self.mainW.statusBar().showMessage(u"Préparation PROLOG")
        prolog = Prolog()
        sourceProlog = 'ecn6.pl'
        temp = 'temp.pl'
        fileR = open(sourceProlog, "r")
        text = fileR.read()
        fileR.close()
        new_prolog_code = open(temp,'w')
        new_prolog_code.write(text)
        # Envoi des paramètres vers Prolog
        new_prolog_code.write(lM)
        new_prolog_code.write(lD)
        new_prolog_code.write(lS)
        new_prolog_code.close()
        prolog.consult(temp)
        # Exécution de la requête dans Prolog
        print "Debut PROLOG"
        self.mainW.statusBar().showMessage(u"Début PROLOG")
        prolog.query("schedule").next()
        # Récupération des résultats depuis Prolog
        self.mainW.statusBar().showMessage(u"Retour PROLOG")
        for result in prolog.query("sol(LSS)"):
            LSS = result['LSS']
        prolog = None
        print "Retour PROLOG"
        ...
au retour sur la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
        for result in prolog.query("sol(LSS)"):
j'ai une exception qui est levée :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
  File "C:\Users\Frederic\workspace\ECN\planning.py", line 327, in onMAJ
    for result in prolog.query("sol(LSS)"):
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\prolog.py", line 108, in __call__
    t = getTerm(swipl_list)
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\easy.py", line 326, in getTerm
    res = getList(t)
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\easy.py", line 339, in getList
    result.append(getTerm(head))
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\easy.py", line 328, in getTerm
    res = getFunctor(t)
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\easy.py", line 346, in getFunctor
    return Functor.fromTerm(t)
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\easy.py", line 194, in fromTerm
    args.append(getTerm(a0 + i))
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\easy.py", line 326, in getTerm
    res = getList(t)
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\easy.py", line 339, in getList
    result.append(getTerm(head))
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\easy.py", line 326, in getTerm
    res = getList(t)
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\easy.py", line 339, in getList
    result.append(getTerm(head))
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\easy.py", line 324, in getTerm
    res = _getterm_router[p](t)
  File "C:\Python27\lib\site-packages\pyswip-0.2.3-py2.7-win-amd64.egg\pyswip\easy.py", line 289, in getLong
    if PL_get_long(t, addressof(i)):
WindowsError: exception: access violation writing 0x00007FF9049B5E10
Ce qui est surprenant, c'est que lorsque je lance une autre procédure avant je n'ai pas d'erreur et la procédure se déroule normalement ?!
Les recherches que j'ai fait sur le Net ne m'ont pas permis de bien comprendre ce phénomène et donc de le traiter.
Merci pour vos pistes et votre aide.
@+