web-dev-qa-db-fra.com

Construire lxml pour Python 2.7 sous Windows

J'essaye de construire le lxml pour Python 2.7 sur la machine de Windows 64 bits. Je n'ai pas pu trouver lxml Egg for Python version 2.7. Donc, je le compile à partir de sources. Je suis les instructions sur ce site

http://lxml.de/build.html

sous la section de liaison statique. Je reçois 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

Est-ce que quelqu'un peut m'aider avec ça? J'ai essayé de définir le chemin pour que Microsoft Visual Studio .. Je puisse exécuter vcvarsall.bat à partir de la ligne de commande ..

34
Kamal

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

Il y a def find_vcvarsall (version): function (devinez quoi, il cherche 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, cela revient au VS90COMNTOOLS env var.

Si vous n'utilisez pas VS 2008, vous ne disposez ni de la clé de registre ni de la variable d'environnement appropriée. C'est pourquoi distutils ne peut pas trouver le fichier vcvarsall.bat. Not vérifie si le fichier bat est accessible via 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.

Cela étant dit, jetez un coup d'œil à 11.4. distutils.msvccompiler - Compilateur Microsoft section dans la documentation de Python qui indique

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

Martin v. Loewis dans l'e-mail intitulé Téléchargez Visual Studio Express 2008 maintenant sur la liste de diffusion python-list est identique

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, Python Les modules d'extension doivent être construits avec la même version du compilateur (plus, plus précisément, la version CRT) que Python lui-même. Donc, pour construire des modules d'extension pour l'une de ces versions, vous devez avoir une copie de VS 2008 ou VS 2008 Express.

À la lumière des déclarations ci-dessus, vous devriez utiliser VS 2008 si vous souhaitez générer du lxml pour Python 2.7. Par conséquent, bien que définir VS90COMNTOOLS prenne soin de rechercher le fichier vcvarsall.bat, il ne s'agit pas de la solution .

Cela étant dit :) les gens essaient d'utiliser un CRT plus ancien avec un compilateur plus récent:
Puis-je utiliser le compilateur C++ de Visual Studio 2010 avec la bibliothèque d'exécution C++ de Visual Studio 2008?
Comment faire en sorte que le compilateur C++ utilise une version spécifique de CRT?
VS 2008 - Lien avec l’ancienne exécution C

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

59
Piotr Dobrogost

Après avoir suivi la solution recommandée:

  1. télécharger VCForPython27.msi à partir de Microsoft,
  2. en l'installant (Win7, Python (x, y) 2.7.9 32 bits),
  3. entrer/mettre à jour la variable d'environnement VS90COMNTOOLS à la valeur du répertoire d'installation (C:\Program Files (x86)\Common Files\Microsoft\Visual C++ pour Python\9.0)

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

Je devais faire les 2 tweaks incroyablement sales, avant que tout fonctionne maintenant:

  1. modifier "msvc9compiler.py" dans "C:\Python27\Lib\distutils", function find_vcvarsall, pour pointer maintenant vers "Visual C++ pour Python " au lieu de " VC ".
  2. copiez les répertoires du fondateur sous "C:\Fichiers de programme (x86)\Common Fichiers\Microsoft\Visual C++ pour Python\9.0 \" dans "C:\Fichiers de programme (x86)\Fichiers communs\Microsoft\Visual C++ pour Python\" (c’est-à-dire un répertoire Niveau supérieur).

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

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

même si VS90COMNTOOLS est défini, msvc9compiler n'est pas en mesure de trouver vcvarsall.bat car il est installé dans %installdir%/vcvarsall.bat et non %installdir%/VC/vcvarsall.bat.

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

  1. Entrez l'invite de commande MSVC for Python

  2. SET DISTUTILS_USE_SDK = 1

  3. SET MSSdk = 1

  4. python.exe setup.py ...

4
Jorj McKie

Jorj McKie avait presque raison: installer VCForPython27.msi n’est pas suffisant, et oui, il existe un problème dans distutils qui l’empêche de trouver find_vcvarsall. En réalité, le problème ne se trouve pas directement dans distutils, mais dans la manière dont VCForPython27.msi a été empaqueté et où vcvarsall.bat est placé (la disposition des dossiers est différente de celle du kit de développement logiciel VS2008).

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

Une autre solution manuelle si vous êtes bloqué 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

3
gaborous

https://github.com/develersrl/gccwinbinaries

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

0
Robbie Capps