Creación de lxml para Python 2.7 en Windows


Estoy tratando de compilar lxml para Python 2.7 en una máquina con Windows de 64 bits. No pude encontrar lxml egg para la versión Python 2.7. Así que lo estoy compilando a partir de fuentes. Estoy siguiendo instrucciones en este sitio

Http://lxml.de/build.html

En la sección de enlaces estáticos. Estoy recibiendo error

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

¿Puede alguien ayudarme con esto? Intenté establecer la ruta para tener Microsoft Visual Studio.. Puedo ejecutar vcvarsall.bate desde la línea de mando.. pero Python está teniendo problemas

Author: twasbrillig, 2010-06-15

4 answers

Apuesto a que no estás usando VS 2008 para esto:)

Hay def find_vcvarsall(version): función (adivina qué, busca vcvarsall.mtd) con el siguiente comentario

Al principio trata de encontrar la productdir de VS 2008 en el registro. Si eso falla, vuelve a la VS90COMNTOOLS env var.

Si no está utilizando VS 2008, entonces no tiene la clave del registro ni la variable de entorno adecuada y es por eso que distutils no puedo encontrar vcvarsall.bat file. Hace no comprobar si el archivo bat es accesible a través de la variable de entorno PATH.

La solución es definir la variable VS90COMNTOOLS para apuntar al directorio Tools de Visual Studio.

Dicho esto, echa un vistazo a 11.4. distutils.msvccompiler-Microsoft Compiler sección en los documentos de Python que establece

Normalmente, los módulos de extensión necesitan ser compilado con el mismo compilador que se utilizó para compilar Python.

Martin v. Loewis en el correo electrónico titulado Descargue Visual Studio Express 2008 ahora en python-list la lista de correo indica lo mismo

Python 2.6, 2.7 y 3.1 están construidos con ese lanzamiento (es decir, 2008). Porque de otra larga tradición, Python los módulos de extensión deben construirse con la misma versión del compilador (más específicamente, versión CRT) como Python sí mismo. Así que para construir módulos de extensión para cualquiera de estas versiones, es necesario tenga una copia de VS 2008 o VS 2008 Express.

A la luz de las instrucciones anteriores, debería usar VS 2008 si desea compilar lxml para Python 2.7, por lo que aunque configurar VS90COMNTOOLS se encarga de encontrar vcvarsall.bat file no es la solución.

Dicho esto:) la gente intenta usar CRT más antiguo con un compilador más nuevo:
¿Puedo usar el compilador C++ de Visual Studio 2010 con la biblioteca de tiempo de ejecución C++ de Visual Studio 2008?
Cómo hacer cumplir el compilador de C++ para usar una versión específica de CRT?
VS 2008-Enlace contra el tiempo de ejecución de C anterior

Me gustaría agradecer a Kev Dwyer (por señalar la importancia de la versión de VS que se utiliza) y Stefan Behnel (por señalarme a distutils como un lugar que se ocupa de la configuración del compilador) en el subproceso Problema construyendo lxml bajo Windows - error: No se puede encontrar vcvarsall.bat en la lista de correo lxml. También me gustaría agradecer agronholm del canal de IRC #distutils de freenode por confirmación de que distutils contiene código que busca vcvarsall.bat file.

 58
Author: Piotr Dobrogost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:33:58

Después de seguir la solución recomendada:

  1. descargando VCForPython27.msi de Microsoft,
  2. instalándolo (Win7, Python(x, y) 2.7.9 32bit),
  3. introducir / actualizar la variable de entorno VS90COMNTOOLS a el valor del directorio de instalación (C:\Program Archivos (x86)\Common Archivos\Microsoft\Visual C++ para Python \ 9.0)

Mi problema todavía existía (quiero construir una extensión de Python en C).

Tuve que hacer el después de 2 ajustes increíblemente sucios, antes de que todo ahora esté funcionando:

  1. modificar "msvc9compiler.py"{[7] {} en[6]}"C:\Python27\Lib\distutils", function find_vcvarsall , para ahora apuntar a "Visual C++ para Python" en lugar de "VC".
  2. copie el fundador de directorios bajo "C:\Program Archivos (x86)\Common Archivos \ Microsoft \ Visual C++ para Python\9.0 \ " a "C:\Program Archivos (x86)\Common Files\Microsoft\Visual C++ para Python\ " (es decir, un dir subir de nivel).

No puedo decir quién estaba haciendo algo mal aquí - probablemente Yo.

EDITAR. Mover directorios funciona debido al problema descrito en este error de distutils.

Incluso si VS90COMNTOOLS está configurado, msvc9compiler no es capaz de encontrar vcvarsall.bat porque está instalado en %installdir%/vcvarsall.bat y no en %installdir%/VC/vcvarsall.bat

La solución descrita está utilizando el símbolo del sistema de Visual C++:

  1. Introduzca MSVC para el símbolo del sistema de Python

  2. ESTABLECER DISTUTILS_USE_SDK=1

  3. SET MSSdk=1

  4. Python.exe setup.py ...

 4
Author: Jorj McKie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-06 10:56:47

Jorj McKie era casi correcto: de hecho instalando VCForPython27.msi no es suficiente, y sí hay un problema en distutils que le impide encontrar find_vcvarsall. De hecho, el problema no está directamente en distutils, sino en cómo VCForPython27.msi fue empaquetado y donde vcvarsall.bat se coloca (el diseño de carpetas es diferente del SDK VS2008).

Una solución simple mientras tanto, esto se parchea tal vez en Python 2.7.11: use setuptools en lugar de distutils.

Otra solución manual si estás atascado con 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 ...

Informe de error y solución por Gregory Szorc: http://bugs.python.org/issue23246

Más información y una solución para usar %%cython magic dentro de IPython: https://github.com/cython/cython/wiki/CythonExtensionsOnWindows

 3
Author: gaborous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-28 18:33:40

Https://github.com/develersrl/gccwinbinaries

Tuve problemas similares. Esto funcionó instantáneamente sin nada más que usar un asistente de instalación y establecer una preferencia.

 0
Author: Robbie Capps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-18 00:33:46