导入DLL到Python 3没有imp.load_dynamic

目标

我正在尝试将Python接口的 Windows支持添加到目前只支持Linux的Total Phase Aardvark 。 这是可用接口仅为.so(Linux)或.dll(Windows)封闭源二进制文件的设备的封装。 然而,它是作为一个Python包(不知道这是否是正确的术语),而不是仅仅用Ctypes加载的标准C接口。

文件结构

在这个项目中,我们有一个与导入脚本相同级别的ext文件夹,Linux和Windows的32/64库(由我添加):

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 

导入问题

Linux实现使用:

 from .ext.linux32 import aardvark as api 

我最初testing在Python 2.7中添加窗口导入,无法获得相对path样式导入工作。 我成功的唯一方法是以下几点:

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

这看起来很难看,但是对Python 2.7来说工作正常,并且所有的API都可用。

我切换到Python 3.4在那里testing,看到imp已被弃用。 不仅如此,从3.2开始,Python 3中的load_dynamic看起来并不像。 我无法在Python 3.4中find使此DLL可用的方法。

尝试

方法1

在Python 2.7和Python 3.4中都失败了

 from .ext.win32 import aardvark as api 

方法2

在Python 2.7和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')) 

方法3

在Python 2.7中工作,在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')) 

方法4

不要在Python 2.7或Python 3.4中抛出错误,但不是我正在寻找的

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

在Python 2.7中工作(imp.load_dynamic)导入, dir(api)给了我:

['__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_string', 'py_aa_target_power', 'py_aa_unique_id', 'py_aa_version', 'py_version']

ctypes import dir(api)给我:

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

我不知道接下来要做什么。 我很好用Python 2.7中的东西,但我真的想提供Python 3的兼容性。