2015-08-16 2 views
1

Pour accéder à un périphérique USB HID connecté sur mon ordinateur, j'utilise la fonction find_all_hid_devices() du package pywinusb.hid.find_all_hid_devices() dans la coroutine asynchrone

Maintenant, je voudrais accéder à ce périphérique HID à partir d'une coroutine asynchrone. Avec le code suivant

@asyncio.coroutine 
def main(): 
    from pywinusb import hid 
    a = hid.find_all_hid_devices() 

L'erreur suivante est renvoyée:

Traceback (most recent call last): 
    File "C:\Python34\lib\site-packages\pywinusb\hid\core.py", line 122, in find_all_hid_devices 
    for interface_data in winapi.enum_device_interfaces(h_info, guid): 
    File "C:\Python34\lib\site-packages\pywinusb\hid\winapi.py", line 466, in enum_device_interfaces 
    byref(dev_interface_data)): 
ctypes.ArgumentError: argument 1: <class 'OverflowError'>: int too long to convert 

Le même appel à hid.find_all_hid_devices() fonctionne cependant lui-même, dans une plaine principale sans asyncio. Est-ce dû au fait que j'essaie d'accéder au sein d'une coroutine? Quelle est la bonne façon d'y parvenir?

Répondre

1

pywinusb bibliothèque est synchrone par conception, vous devriez donc l'appeler dans le pool de threads.

@asyncio.coroutine 
def f(): 
    loop = asyncio.get_event_loop() 
    a = yield from loop.run_in_executor(None, hid.find_all_hid_devices) 

appel synchrone de coroutine est techniquement permis, mais déconseillée car elle fait une pause boucle d'événements pour la période de longue date.

+0

Génial, merci pour votre réponse! Une fois que je reçois mon périphérique HID, le code que je dois exécuter est également (malheureusement) synchrone (par exemple 'device.dosomething1',' device.dosomething2'). Suggéreriez-vous, bien que découragé, que j'emballe toutes ces instructions dans un pool de threads aussi? – Namux

+0

Pour être propre: passer des appels de synchronisation dans le pool de threads est totalement correct, le pool est destiné à cet usage. Pousser l'appel de synchronisation dans l'exécuteur le convertit en appel asynchrone à partir de la perspective asynchrone. Alors oui, s'il vous plaît restez sur ce chemin. –