Makina Blog

Le blog Makina-corpus

Compiler les librairies Python sous Windows


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 pycryptocopying 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 :


 

 

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 :

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 :

 

Dans les langages proposés, sélectionnez Visual C++ et les outils 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.

 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:

 

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.

Formations associées

Formations IA / Data Science

Formation Initiation au Python scientifique

Toulouse Du 28 au 30 mai 2024

Voir la formation

Formations Python

Formation Python

À distance (FOAD) Du 29 janvier au 2 février 2024

Voir la formation

Formations Python

Formation Python avancé

Nantes Du 8 au 12 avril 2024

Voir la formation

Actualités en lien

Image
Webinaire découverte de Canari
10/04/2024

Revoir les webi­naires : décou­verte de l’ou­til CANARI-France

L’ap­pli­ca­tion CANARI-France est destiné aux acteurs agri­coles afin de calcu­ler des indi­ca­teurs agro-clima­tiques à partir de projec­tions clima­tiques. Décou­vrer en le replay des 4 webi­naires orga­ni­sés par Sola­gro et l’ADEME.

Voir l'article
Image
Python
26/07/2023

La formation Python éligible au CPF est enfin arrivée

Makina Corpus propose un nouvelle formation Python éligible au CPF. Grâce à cette certification, cette formation peut être entièrement financée par votre compte Compte Personnel de Formation.

Voir l'article
Image
Canari
20/07/2023

CANARI Europe, un service climatique innovant pour adapter l'agriculture européenne

Après un lancement réussi de CANARI l'application de projections climatiques dédiée à l'agriculture en France, CANARI s’étend à toute L’Europe et au nord du Maghreb.

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus