Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

CTypes chargement dll avec conflit QT (Erreur 127)

+2 votes

J'utilise python 2.7 avec les libs :
- PySide 1.2.2
- Ctypes

Avec CTypes je charge une dll d'un fournisseur qui utilise Qt dans une version différente de mon programme. Du coup j'obtiens une erreur :

Exception: [Error 127] La procédure spécifiée est introuvable

Mon code est simple :

os.environ['PATH'] = os.path.join(os.path.dirname(__file__), "win") + ';' + os.environ['PATH']
self.path = ctypes.util.find_library("ma.dll")
self.libext = ctypes.CDLL(self.path)

J'ai utilisé un virtualenv, mais cela ne change rien, ce qui est normal. Quels sont les choix qui s'offrent à moi ?
Je pourrais changer de lib graphique, mais c'est courir le risque qu'un autre fournisseur me donne un dll avec une version différente de cette même lib.

demandé 18-Jun-2015 par nesteban (132 points)

Est-ce que tu es sur que find_library te trouve bien ta dll ?
Si ce n'est pas le cas il renvoit None, ce qui ne fait pas planter ctypes.CDLL.

In [10]: alib = ctypes.CDLL(None)
In [11]: alib
Out[11]: <CDLL 'None', handle fffffffffffffffe at 10472e150>
In [12]: alib.afunction()
# full stacktrace
AttributeError: dlsym(RTLD_DEFAULT, afunction): symbol not found

1 Réponse

+1 vote

C'est ce que j'avais cru au début, mais avec

self.path = ctypes.util.find_library(None)

j'obtiens une erreur différente :

Couldn't load the XXX lib!
Exception: object of type 'NoneType' has no len()

En debug mon path est correct et amène bien à la dll.

Information supplémentaire : le même code, sans les imports suivants :

from PySide.QtGui import QApplication, QIcon, QMenu, QSystemTrayIcon
from PySide.QtCore import QSettings

.. exécute correctement la dll. C'est ce qui m'a fait penser aux conflits de versions de Qt

répondu 19-Jun-2015 par nesteban (132 points)

J'ai réussi à lancer la lib externe en utilisant un subprocess :

subprocess.call(["python ", 'SubProcessRequest.py", mes-params)

Avec ça, j'ai deux interfaces Qt avec des versions différentes.

Le problème de cette méthode est que je dois embarquer python sur la machine cible ET que je dois déployer certains de mes scripts python (comme le SubProcessRequest.py). Ce n'est pas envisageable.

La piste du subprocess est la bonne je pense, mais à ce jour je n'ai pas trouvé comment créer un thread parallèle en exécutant une méthode. Même Processify me retourne la fameuse Erreur 127, dû dans mon cas à un conflit de dépendances.

Quelqu'un aurait une idée ?

...