35 votes

Construction de lxml pour Python 2.7 sous Windows

J'essaie de construire lxml pour Python 2.7 sur une machine Windows 64 bit. Je n'ai pas trouvé d'œuf lxml pour la version 2.7 de Python. Je le compile donc à partir des sources. Je suis les instructions sur ce site

http://lxml.de/build.html

dans la section des liens statiques. J'obtiens une erreur

C:\Documents and Settings\Administrator\Desktop\lxmlpackage\lxml-2.2.6\lxml-2.2.
6>python setup.py bdist_wininst --static
Building lxml version 2.2.6.
NOTE: Trying to build without Cython, pre-generated 'src/lxml/lxml.etree.c' need
s to be available.
ERROR: 'xslt-config' is not recognized as an internal or external command,
operable program or batch file.

** make sure the development packages of libxml2 and libxslt are installed **

Using build configuration of libxslt
Building against libxml2/libxslt in one of the following directories:
  ..\libxml2-2.7.6--win32--w2k--x64\lib
  ..\libxslt-1.1.26--win32--w2k--x64--0002\lib
  ..\zlib-1.2.4--win32--w2k--x64
  ..\iconv-1.9.1--win32--w2k--x64-0001\lib
running bdist_wininst
running build
running build_py
running build_ext
building 'lxml.etree' extension
error: Unable to find vcvarsall.bat

Quelqu'un peut-il m'aider ? J'ai essayé de définir le chemin d'accès pour avoir Microsoft Visual Studio . Je peux exécuter vcvarsall.bat à partir de la ligne de commande, mais python a des problèmes.

61voto

Piotr Dobrogost Points 14412

Je parie que vous n'utilisez pas VS 2008 pour cela :)

Il y a def find_vcvarsall(version) : (devinez quoi, elle recherche vcvarsall.bat) dans distutils avec le commentaire suivant

Au début, il essaie de trouver le productdir de VS 2008 dans le registre. Si cela échoue, il se rabat sur le répertoire VS90COMNTOOLS.

Si vous n'utilisez pas VS 2008, vous n'avez ni la clé de registre ni la variable d'environnement appropriée et c'est pourquoi distutils ne peut pas trouver le fichier vcvarsall.bat. Il fait no vérifier si le fichier bat est accessible par la variable d'environnement PATH.

La solution consiste à définir la variable VS90COMNTOOLS pour qu'elle pointe vers le répertoire Tools de Visual Studio.

Ceci étant dit, jetez un coup d'oeil à 11.4. distutils.msvccompiler - Compilateur Microsoft dans la documentation de Python qui stipule que

En général, les modules d'extension doivent être compilés avec le même compilateur qui a été utilisé pour compiler Python.

Martin v. Loewis dans le courriel intitulé Téléchargez maintenant Visual Studio Express 2008 sur la liste de diffusion python-list déclare la même chose

Python 2.6, 2.7, et 3.1 sont tous construits avec cette version (c'est-à-dire 2008). Parce que d'une autre longue tradition, les modules d'extension de Python doivent être construits avec la même la même version du compilateur (plus spécifiquement, la version CRT) que Python lui-même. lui-même. Ainsi, pour construire des modules d'extension pour l'une de ces versions, vous devez avoir une copie de VS 2008 ou VS 2008 Express.

A la lumière des déclarations ci-dessus, vous devrait utiliser VS 2008 si vous voulez construire lxml pour Python 2.7, donc bien que la configuration de VS90COMNTOOLS s'occupe de trouver le fichier vcvarsall.bat, ce n'est pas un problème. el solution.

Ceci étant dit :) les gens essaient d'utiliser les anciens CRT avec les nouveaux compilateurs :
Puis-je utiliser le compilateur C++ de Visual Studio 2010 avec la bibliothèque d'exécution C++ de Visual Studio 2008 ?
Comment forcer le compilateur C++ à utiliser une version spécifique du CRT ?
VS 2008 - Lien avec un ancien runtime C

Je voudrais remercier Kev Dwyer (pour avoir souligné l'importance de la version de VS utilisée) et Stefan Behnel (pour m'avoir indiqué distutils comme un endroit traitant de la configuration du compilateur) dans le fil de discussion Problème de construction de lxml sous Windows - erreur : Impossible de trouver vcvarsall.bat sur la liste de diffusion lxml. Je tiens également à remercier agronholm depuis le canal IRC freenode #distutils pour confirmation que distutils contient du code qui recherche le fichier vcvarsall.bat.

4voto

Jorj McKie Points 101

Après avoir suivi la solution recommandée :

  1. téléchargement de VCForPython27.msi de Microsoft,
  2. Je l'installe (Win7, Python(x, y) 2.7.9 32bit),
  3. saisie / mise à jour de la variable d'environnement VS90COMNTOOLS à la valeur du répertoire d'installation ( C:\Program Fichiers (x86) \Common Fichiers \Microsoft\Visual C++ pour Python \9.0 )

mon problème existait toujours (je veux construire une extension Python en C).

J'ai dû faire les 2 ajustements suivants, incroyablement sales, avant que tout fonctionne effectivement maintenant :

  1. modifier "msvc9compiler.py" en " C:\Python27\Lib\distutils " , fonction find_vcvarsall pour indiquer maintenant "Visual C++ pour Python " au lieu de "VC" .
  2. copier les répertoires fondateurs sous " C:\Program Fichiers (x86) \Common Fichiers \Microsoft\Visual C++ pour Python \9.0\ " a " C:\Program Fichiers (x86) \Common Fichiers \Microsoft\Visual C++ pour Python" (c'est-à-dire un dir niveau supérieur).

Je ne peux pas dire qui a fait quelque chose de mal ici - probablement moi.

EDIT. Le déplacement des répertoires fonctionne à cause du problème décrit dans ce bug des distutils .

même si VS90COMNTOOLS est activé, msvc9compiler n'est pas en mesure de trouver vcvarsall.bat parce qu'il est installé dans le dossier de l'utilisateur. %installdir%/vcvarsall.bat et non %installdir%/VC/vcvarsall.bat

La solution de contournement décrite consiste à utiliser l'invite de commande de Visual C++ :

  1. Entrez dans l'invite de commande de MSVC pour Python

  2. SET DISTUTILS_USE_SDK=1

  3. SET MSSdk=1

  4. python.exe setup.py ...

3voto

user1121352 Points 1066

Jorj McKie avait presque raison : en effet, installer VCForPython27.msi n'est pas suffisant, et oui il y a un problème dans distutils qui l'empêche de trouver find_vcvarsall. En fait, le problème n'est pas directement dans distutils, mais dans la façon dont VCForPython27.msi a été empaqueté et où vcvarsall.bat est placé (la disposition des dossiers est différente de celle du SDK VS2008).

Une solution de contournement simple en attendant que cela soit corrigé peut-être dans Python 2.7.11 : utiliser setuptools au lieu de distutils.

Une autre solution de contournement manuelle si vous êtes coincé avec distutils :

1) Enter MSVC for Python command prompt
2) SET DISTUTILS_USE_SDK=1
3) SET MSSdk=1
4) you can then build your C extensions: python.exe setup.py ...

Rapport de bogue et solution de contournement par Gregory Szorc : http://bugs.python.org/issue23246

Plus d'informations et une solution de contournement pour utiliser la magie %%cython dans IPython : https://github.com/cython/cython/wiki/CythonExtensionsOnWindows

0voto

Robbie Capps Points 128

https://github.com/develersrl/gccwinbinaries

J'ai eu des problèmes similaires. Cela a fonctionné instantanément sans autre chose que l'utilisation d'un assistant d'installation et la définition d'une préférence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X