Identification

 
Login
Mot de passe
Demander une information
Interfacer une DLL à la sauce python
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.
Photo de l'OPN-2001

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&eacute;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
  1. Ajout des répertoires des exécutables dans le PATH de windows.
  2. Suppression des anciennes compilations.
  3. Génération des fichiers de définition et librairies
  4. 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
  1. D'abord, on importe le nouveau module.
  2. On ouvre le port où se trouve le lecteur de code barre.
  3. On demande s'il y a des données de disponible.
  4. Si c'est le cas, on lit combien il y en a.
  5. On lit chacune d'elle.
  6. 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()