Accueil / Blog / Métier / 2016 / compile_python_wheels_windows

Compiler les librairies Python sous Windows

Par Gaël Pegliasco publié 27/05/2016, édité le 30/05/2016
Installer de nouvelles librairies se fait relativement facilement avec Python via la ligne de commande et l'instruction « pip » ; qui signifie PIP Installs Package. Mais sous Windows cela se solde très souvent par le message 'error: Unable to find vcvarsall.bat' car « pip » essaye de compiler certaines sources lorsqu'elles sont écrites en C. Nous vous proposons dans ce tutoriel de corriger cette erreur.

Introduction

 Installer de nouvelles librairies se fait relativement facilement avec Python via la ligne de commande et l'instruction « pip » ; qui signifie PIP Installs Package.
L'avantage de cet outil est qu'il télécharge automatiquement la dernière version des librairies désirées depuis le site PyPi ainsi que toutes ses dépendances.

 Cette commande est très riche et vous propose de nombreuses options comme préciser spécifiquement les versions des librairies que vous souhaitez installer.
Il est d'ailleurs vivement recommandé de les installer dans des environnements virtuel avec virtualenv ou pyenv.

Là ou « pip » est très fort c'est qu'il réalise aussi toutes les étapes de compilation si cela est nécessaire.

Mais sous Windows, c'est là que le bât blesse.

En effet, autant sous Linux et la plupart des autres systèmes Unix, les environnements de développement sont généralement installés par défaut et n'importe quel utilisateur aura appris dès ses débuts à lancer une compilation via l'invite de commande aussi facilement qu'un utilisateur Windows double-clique sur un « .exe » ; autant sous Windows cette tâche s'avère être un véritable problème car aucun outil de compilation n'est fourni nativement sur cet OS. Et c'est clairement une volonté du système de limiter les utilisateurs aux seules interactions graphique/souris.

C'est très convivial mais dans un environnement professionnel, ce n'est pas toujours suffisant.

Nous vous proposons donc dans ce tutoriel de vous aider à compiler vos librairies avec pip sous Windows.

Comment installer une librairie Python (PyCrypto) sous Windows

Un bon exemple est la compilation de la librairie PyCrypto qui est requise par de nombreux projets Python, comme PySNMP.
Sous Windows, avec un Python par défaut, vous obtenez ceci lorsque vous lancez la commande depuis l'invite de commande MSDOS :

C:\Users\utilisateur>c:\Python35\Scripts\pip.exe install pycrypto
Collecting pycrypto
Using cached pycrypto-2.6.1.tar.gz
Installing collected packages: pycrypto
Running setup.py install for pycrypto


copying lib\Crypto\Signature\__init__.py -> build\lib.win-amd64-3.5\Crypto\Signature
Skipping optional fixer: buffer
Skipping optional fixer: idioms
Skipping optional fixer: set_literal
Skipping optional fixer: ws_comma
running build_ext
building 'Crypto.Random.OSRNG.winrandom' extension
warning: GMP or MPIR library not found; Not building Crypto.PublicKey._fastmath.
error: Unable to find vcvarsall.bat

----------------------------------------
Command "c:\python35\python.exe -c "import setuptools, tokenize;__file__='C:\\Users\\UTILIS~1\\AppData\\Local\\Temp\\pip-build-oll8xinc\\pycrypto\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record C:\Users\UTILIS~1\AppData\Local\Temp\pip-9v78ols4-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in C:\Users\UTILIS~1\AppData\Local\Temp\pip-build-oll8xinc\pycrypto

You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

C:\Users\utilisateur>

Ce qui donne en images :

Install PyCrypto on Windows with pip
 

 Install PyCrypto on Windows with pip error Unable to find vcvarsall.bat

C'est sur cette dernière capture que les problèmes apparaissent car « pip » n'installe pas de binaires Windows, il les compile !

Mais ce n'est pas de la meilleure inspiration, pourriez-vous penser !
Et vous n'auriez pas tout à fait tort. Mais c'est ainsi, et il va falloir faire avec.
En même temps, c'est souvent la seule solution pour avoir une librairie vraiment adaptée et optimisée pour votre processeur et système.
Ne le blâmons pas trop vite.

Résoudre les problèmes d'installation de librairies Python

A ce niveau du processus d'installation « pip » ne vous laisse plus beaucoup d'options :

  1. Soit vous trouvez un paquet binaire de la librairie problématique pour votre Python et votre Windows

  2. Soit vous installez une distribution python toute packagée qui fournit cette librairie

  3. Soit vous renoncez à installer l'outil, ou vous passez sous Linux ; mais ce n'est pas possible car vous en avez besoin et votre environnement de travail c'est Windows !

  4. Soit vous donnez les moyens à « pip » de compiler sous Windows

La première solution est souvent possible en allant regarder dans la section download du site officiel de la librairie ou sur la page Pypi associée ou encore via le site Python Wheels.

Hélas, pour PyCrypto, cela ne fonctionne pas :

  • Rien sur Pypi

  • Rien sur le site officiel

Face à cette suite d’événements que l'on pourrait croire tirés tout droit de la loi de Murphy, vous avez encore la possibilité d'utiliser votre moteur de recherche préféré, ou le site stackoverflow qui restent toujours vos amis dans les moments difficiles afin de trouver un binaire pycrypto.

Et dans ce cas vous en trouverez :

Mais, dans certains cas cela n'ira toujours pas :

  • Le binaire n'est pas pour votre version de Windows

  • Le binaire n'est pas pour votre version de Python

  • Le binaire n'est pas pour votre architecture (32 ou 64 bits)

  • Vous n'avez pas confiance dans l'origine du binaire et vous avez bien raison !

Alors, vous pouvez vous rabattre sur la seconde option : installer une distribution Python incluant déjà la librairie PyCrypto.

Plusieurs distributions dont Anaconda vous le proposent et c'est souvent un excellent choix que j'ai tendance à conseiller et pratiquer, surtout pendant les formations.

Mais l'archive Anaconda fait quand même plus de 350Mo et inclut tout un tas de choses supplémentaires dont vous n'avez pas besoin, et, là encore, ce n'est pas optimisé pour votre processeur qui a les dernières instructions SSE5 ou MMX6 et vous comptez bien chiffrer et déchiffrer à la vitesse de la lumière et plus si possible.

Enfin, bref, ce n'est pas adapté à votre usage, ni envisageable pour vos clients.

Il vous reste l'option Linux, clairement, pour développer avec Python c'est le système idoine.

Mais non, vous travaillez sous Windows !
Et comme vous n'êtes pas du genre à lâcher le morceau vous décidez de compiler cette librairie, surtout que sur stackoverflow il y a des réponses dans ce sens.

Ce sera la solution que nous vous proposerons ici !

Compilation de librairies Python sous Windows

Nous y voilà donc, vous trouverez ci-dessous un procédé relativement générique et fiable qui vous permettra de compiler toute librairie Python le nécessitant sous Windows.

En voici les étapes :

  • Identifier votre version de Python, son architecture (32 ou 64 bits) et la version du compilateur utilisé pour le compiler

  • Télécharger et installer le compilateur identifié au point précédent

  • Lancer l'installation avec pip

Identifier Python et le compilateur requis

Vous allez devoir compiler la librairie dans une version adaptée à votre interpréteur :

  • 32 ou 64 bits

  • Avec les mêmes librairies pour éviter les problèmes à l'exécution

L'idéal est d'utiliser le compilateur qui a servi à compiler votre Python ce qui est indiqué sur le site officiel de Python dans le lien précédent.

Mais plus généralement l'information est fournie dans l'entête de la console Python en mode interpréteur, comme le précise très bien ce fil stackoverflow :

Find Python compiler version

Dans notre cas c'est la chaîne « [MSC v.1900 64 bit (AMD64)] » qui nous fournit l'information :

  • MSC : Microsoft C

  • v.1900 : la version du compilateur

  • 64 bit : l'architecture

Il ne nous reste plus qu'à trouver le Visual Studio de Microsoft v1900, 64bits.

Télécharger et installer Microsoft Visual Studio

Pour identifier à quelle version du produit le numéro « v.1900 » correspond précisément vous pouvez chercher (sans véritable succès dans mon cas) sur le site de Microsoft ou Visual Studio. A défaut vous référer à Wikipédia et la valeur _MSC_VER décrite pour chaque version.

Dans notre exemple il s'agit de Miscrosoft Visual Studio 2015.

Vous pouvez la télécharger depuis cette URL :

Nous travaillerons avec Visual Studio community edition 2015 dans la suite de ce tutoriel.

Une fois téléchargée, installez-là, attention, c'est volumineux (10Go minimum) et lent, très lent !
Commencez par choisir l'installation personnalisée :

 Microsoft Visual Studio 15 installation customized

Dans les langages proposés, sélectionnez Visual C++ et les outils Python :

 Microsoft Visual Studio 15 installation for Python

Pour diminuer la taille occupée vous pouvez ne pas installer les outils « Windows and Web Developement », et peut-être les « Microsoft Foundation Classes for C++ », mais je n'ai pas essayé.

Ensuite, patientez.

Microsoft Visual Studio 15 installed 

 Compiler PyCrypto

Une fois l'installation terminée, redémarrez l'ordinateur, lancez une invite de commande MSDOS et exécutez de nouveau la commande « pip install pycrypto »

C:\Users\utilisateur>c:\Python35\Scripts\pip.exe install pycrypto
Collecting pycrypto
  Using cached pycrypto-2.6.1.tar.gz
Installing collected packages: pycrypto
  Running setup.py install for pycrypto
Successfully installed pycrypto-2.6.1
You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

C:\Users\utilisateur>python
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pycrypto
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'pycrypto'
>>> import Crypto
>>> help(Crypto)
Help on package Crypto:

NAME
    Crypto - Python Cryptography Toolkit

Ce qui donne en images:

 PyCrypto installation successfull

Python import py crypto

Conclusion

Ce tutoriel vous a mené sur une solution standard de compilation de librairies Python sous Windows.
Les différentes étapes menant des erreurs à la solution ont été introduites afin de vous permettre de mieux suivre le cheminement menant à la solution finale.
Il est évident que le dernier chapitre aurait suffit.
La partie traitant des installations de binaires (wheels) reste une piste sérieuse à étudier et utiliser si vous ne souhaitez pas ou ne pouvez pas vous permettre d'installer Visual Studio.

En vous forçant, vous trouverez toujours un binaire...

Une fois Visual Studio installé vous devriez pouvoir compiler n'importe quelle librairie, notamment des choses plus compliquées comme PWM.
Mais nous y reviendrons.

Enfin, si vous êtes intéressé par l'installation de PySNMP sous Windows, suivez ce tutoriel et n'hésitez pas à suivre nos formations Python pour devenir un AS de ce langage.

 

 

 

ABONNEZ-VOUS À LA NEWSLETTER !
Voir aussi
Machine Learning : classer automatiquement vos données à l'import Machine Learning : classer automatiquement vos données à l'import 20/03/2018

Comment utiliser des algorithmes de machine learning pour importer correctement des données dans ...

Talend Tutoriel : comprendre les connexions iterate 20/12/2013

Le lien iterate est décrit assez succinctement dans le manuel utilisateur de Talend (User Guide). ...

Créer une carte avec Umap Créer une carte avec Umap 03/07/2019

[ Tuto ] créer une carte utilisant OpenStreetMap et y ajouter ou importer des données, puis ...

Utilisation de la vision par ordinateur pour redresser des images Utilisation de la vision par ordinateur pour redresser des images 14/05/2019

Dans un module de comparaison d'images, lorsque deux photographies ne sont pas cadrées de la même ...

Bien configurer ses tests Python avec tox et Travis Bien configurer ses tests Python avec tox et Travis 18/03/2019

Le plus difficile dans le développement des tests unitaires c'est souvent de se motiver à écrire ...