Importation de DLL dans Python 3 sans imp.load_dynamic

Objectif

J’essaye d’append le support Windows pour l’ interface Python à la phase totale Aardvark qui est actuellement Linux seulement. Il s’agit d’un wrapper pour un périphérique dont l’interface disponible est uniquement un fichier binary à source fermée .so (Linux) ou .dll (Windows). Cependant, il a été créé en tant que paquet Python (pas sûr que ce soit le bon terme) plutôt que juste en tant qu’interface C standard que vous chargeriez avec ctypes.

Structure du fichier

Dans ce projet, nous avons un dossier ext au même niveau que le script effectuant l’importation, avec des bibliothèques 32/64 pour Linux et Windows (ajoutées par moi):

pyaardvark.py (file doing imports) ext linux32 __init.py__ (empty) aardvark.so linux 64 __init.py__ (empty) aardvark.so win32 __init.py__ (empty) aardvark.dll win64 __init.py__ (empty) aardvark.dll 

Problèmes d’importation

L’implémentation Linux utilise:

 from .ext.linux32 import aardvark as api 

Au départ, je testais l’ajout de l’importation de fenêtres dans Python 2.7 et je ne pouvais pas utiliser l’importation du style de chemin relatif. La seule méthode avec laquelle j’ai réussi est la suivante:

 import imp import os cur_path = os.path.dirname(__file__) api = imp.load_dynamic('aardvark', os.path.join(cur_path, 'ext', 'win32', 'aardvark.dll')) 

Cela semble moche, mais fonctionne bien avec Python 2.7 et toutes les API sont disponibles.

Je passe à Python 3.4 pour tester et voir que imp est obsolète. Non seulement cela, il ne semble pas que imp ait load_dynamic dans Python 3 à partir de 3.2. Je ne trouve pas de moyen dans Python 3.4 pour rendre cette DLL disponible.

Tentatives

Méthode 1

Échec à la fois dans Python 2.7 et Python 3.4

 from .ext.win32 import aardvark as api 

Méthode 2

Échec à la fois dans Python 2.7 et Python 3.4

 import importlib import os cur_path = os.path.dirname(__file__) api = importlib.import_module('aardvark', os.path.join(cur_path, 'ext', 'win32', 'aardvark.dll')) 

Méthode 3

Fonctionne dans Python 2.7, échoue dans Python 3.4

 import imp import os cur_path = os.path.dirname(__file__) api = imp.load_dynamic('aardvark', os.path.join(cur_path, 'ext', 'win32', 'aardvark.dll')) 

Méthode 4

Ne jette pas d’erreur dans Python 2.7 ou Python 3.4, mais pas ce que je cherche

 import os cur_path = os.path.dirname(__file__) from ctypes import cdll api = cdll.LoadLibrary(os.path.join(cur_path, 'ext', 'win32', 'aardvark.dll')) 

Avec le travail (imp.load_dynamic) importé dans Python 2.7, dir(api) me donne:

['__doc__', '__file__', '__name__', '__package__', 'py_aa_async_poll', 'py_aa_close', 'py_aa_configure', 'py_aa_features', 'py_aa_find_devices', 'py_aa_find_devices_ext', 'py_aa_gpio_change', 'py_aa_gpio_direction', 'py_aa_gpio_get', 'py_aa_gpio_pullup', 'py_aa_gpio_set', 'py_aa_i2c_bitrate', 'py_aa_i2c_bus_timeout', 'py_aa_i2c_free_bus', 'py_aa_i2c_monitor_disable', 'py_aa_i2c_monitor_enable', 'py_aa_i2c_monitor_read', 'py_aa_i2c_pullup', 'py_aa_i2c_read', 'py_aa_i2c_read_ext', 'py_aa_i2c_slave_disable', 'py_aa_i2c_slave_enable', 'py_aa_i2c_slave_read', 'py_aa_i2c_slave_read_ext', 'py_aa_i2c_slave_set_response', 'py_aa_i2c_slave_write_stats', 'py_aa_i2c_slave_write_stats_ext', 'py_aa_i2c_write', 'py_aa_i2c_write_ext', 'py_aa_i2c_write_read', 'py_aa_log', 'py_aa_open', 'py_aa_open_ext', 'py_aa_port', 'py_aa_sleep_ms', 'py_aa_spi_bitrate', 'py_aa_spi_configure', 'py_aa_spi_master_ss_polarity', 'py_aa_spi_slave_disable', 'py_aa_spi_slave_enable', 'py_aa_spi_slave_read', 'py_aa_spi_slave_set_response', 'py_aa_spi_write', 'py_aa_status_ssortingng', 'py_aa_target_power', 'py_aa_unique_id', 'py_aa_version', 'py_version']

ctypes import dir(api) me donne:

['_FuncPtr', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getatsortingbute__', '__getitem__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_func_flags_', '_func_restype_', '_handle', '_name']

Je ne sais pas quoi essayer ensuite. Je travaille très bien avec Python 2.7, mais j’aimerais vraiment offrir la compatibilité avec Python 3.