|
Le but de cette page est d'expliquer comment interfacer une DLL C/C++ en python, sous Windows. Pour ce faire, je vais prendre l'exemple d'un petit lecteur de code barre, opticon OPN-2001, que vient de m'envoyer TNS pour scanner mes courses. |
|
Ingrédients : |
- python bien sûr ! (2.5 dans mon exemple)
- Le SDK d'opticon : CSp2.lib, CSp2.dll et CSp2.h (il faudra ágalement installer les drivers pour simuler le port USB en port COM)
- MingW pour les outils sur les DLL et la compilation (3.2.0 dans mon exemple)
- Swig : pour réaliser l'interfaçage C/C++ - python (1.3.29 dans mon exemple)
|
La recette : |
|
|
1ère étape, création de la libraire _opticon.pyd |
Création de l'interface opticon.i |
Le but de l'interface opticon.i, comme son nom l'indique, est de décrire toutes les fonctions qui seront accessibles dans notre module python.
/* opticon.i */ %module opticon %include cpointer.i %{
#include <windows.h> #include "CSp2.h"
/* Mettre les déclarations de fonctions en-dessous */ extern long InitEx( long nCOMPort ); extern long Restore(); extern long DataAvailable(); extern long ReadRawData( char aResultBuf[], long nMaxResultBuf ); extern long ReadData(); extern long ClearData(); extern long GetPacket( char szData[], long nBcrNr, long nMaxDataSz ); %} extern long InitEx( long nCOMPort ); extern long Restore(); extern long DataAvailable(); extern long ReadRawData( char aResultBuf[], long nMaxResultBuf ); extern long ReadData(); extern long ClearData(); extern long GetPacket( char szData[], long nBcrNr, long nMaxDataSz );
|
Création du programme opticon.c |
Le but du programme opticon.c est d'implémenter les fonctions de l'interface opticon.i.
#include <time.h> #include <stdio.h> #include <string.h>
#include <windows.h> #include "CSp2.h"
long InitEx( long nCOMPort ) { long ret; ret = csp2InitEx(nCOMPort); return ret; }
long Restore() { long ret; ret = csp2Restore(); return ret; }
long DataAvailable() { long ret; ret = csp2DataAvailable(); return ret; }
long ReadRawData( char aResultBuf[], long nMaxResultBuf ) { long ret; ret = csp2ReadRawData(aResultBuf, nMaxResultBuf); return ret; }
long ReadData() { long ret; ret = csp2ReadData(); return ret; }
long ClearData() { long ret; ret = csp2ClearData(); return ret; }
long GetPacket( char szData[], long nBcrNr, long nMaxDataSz ) { long ret; ret = csp2GetPacket(szData, nBcrNr, nMaxDataSz); return ret; }
|
Création du batch go.bat |
- Ajout des répertoires des exécutables dans le PATH de windows.
- Suppression des anciennes compilations.
- Génération des fichiers de définition et librairies
- Compilation de la nouvelle librairie
@echo off
set PATH=%PATH%;D:\swig;D:\MinGW\bin del *.o del opticon.py pexports python25.DLL > libpython25.def dlltool --input-def python25.def --dllname python25.dll --output-lib libpython25.a -k pexports CSp2.DLL > CSp2.def dlltool --input-def CSp2.def --dllname CSp2.dll --output-lib libCSp2.a -k swig -python opticon.i gcc -c opticon.c gcc -c opticon_wrap.c -ID:\python25\include -I. gcc -shared *.o -o _opticon.pyd -LD:\python25\libs -lpython25 CSp2.lib
pause |
|
2ème étape, utilisation du module _opticon |
Paramétrage |
Copie des librairies CSp2.dll et _opticon.pyd dans le répertoire DLLs de python |
Exécution |
- D'abord, on importe le nouveau module.
- On ouvre le port où se trouve le lecteur de code barre.
- On demande s'il y a des données de disponible.
- Si c'est le cas, on lit combien il y en a.
- On lit chacune d'elle.
- Et enfin on ferme le port.
import _opticon
ret = _opticon.InitEx(3)
if ret == 0: is_data = _opticon.DataAvailable() if is_data: nb = _opticon.ReadData()
for i in range(nb): s = " "*255 ret = _opticon.GetPacket(s, i, 255) print i, s
ret = _opticon.Restore()
|