我正在尝试将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可用的方法。
在Python 2.7和Python 3.4中都失败了
from .ext.win32 import aardvark as api
在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'))
在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'))
不要在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的兼容性。