2010-06-15 5 views
33

Ich versuche, Lxml für Python 2.7 auf Windows 64 Bit-Maschine zu erstellen. Ich konnte nicht lxml Ei für Python 2.7 Version finden. Also kompiliere ich es aus Quellen. Ich bin nach Anleitung auf dieser SeiteErstellen von Lxml für Python 2.7 unter Windows

http://lxml.de/build.html

unter statischem Verbindungsabschnitt. Ich bekomme Fehler

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 

Kann mir jemand dabei helfen? Ich habe versucht, den Pfad Einstellung Microsoft Visual Studio zu haben .. ich vcvarsall.bat von der Kommandozeile ausgeführt werden kann .. aber Python hat Probleme

+8

Wenn Sie AMD64 verwenden, können Sie diese versuchen: http: //www.lfd.uci.edu/~ Gohlke/pythonlibs/ – ChristopheD

+0

@Christo Haben Sie Anweisungen irgendwo auf, wie Sie diese ausführbaren Dateien erzeugt? – Kamal

+1

Ich habe diese nicht kompilieren, so das Beste, was zu tun wäre, um den Autor zu kontaktieren: http://www.lfd.uci.edu/~gohlke/ – ChristopheD

Antwort

58

Ich wette, Sie sind nicht VS 2008 für diese Verwendung :)

es gibt def find_vcvarsall(version): Funktion (erraten, was es für vcvarsall.bat aussieht) in distutils mit folgendem Kommentar

At first it tries to find the productdir of VS 2008 in the registry. If that fails it falls back to the VS90COMNTOOLS env var.

Wenn Sie sich nicht mit VS 2008 dann Sie weder den Registrierungsschlüssel noch geeignete Umgebungsvariable und das ist, warum distutils kann die Datei vcvarsall.bat nicht finden. Es tut nicht überprüfen Sie, ob die Bat-Datei über die Umgebungsvariable PATH erreichbar ist.

Die Lösung besteht darin, die VS90COMNTOOLS-Variable so zu definieren, dass sie auf das Tools-Verzeichnis von Visual Studio verweist.

Dass gesagt wird bei 11.4. distutils.msvccompiler — Microsoft Compiler Abschnitt in Python-Dokumentation einen Blick darauf werfen, die besagt,

Typically, extension modules need to be compiled with the same compiler that was used to compile Python.

Martin v. Loewis in der E-Mail Download Visual Studio Express 2008 now auf Python-Liste Mailing-Liste mit dem Titel besagt die gleichen

Python 2.6, 2.7, and 3.1 are all built with that release (i.e. 2008). Because of another long tradition, Python extension modules must be built with the same compiler version (more specifically, CRT version) as Python itself. So to build extension modules for any of these releases, you need to have a copy of VS 2008 or VS 2008 Express.

Angesichts der obigen Aussagen sollten Sie VS 2008 verwenden, wenn Sie lxml für Python 2.7 erstellen möchten, obwohl die Einstellung VS90COMNTOOLS kümmert sich um das Auffinden von vcvarsall.bat Datei es ' s nicht die Lösung.

Davon abgesehen :) Menschen mit neueren Compiler ältere CRT zu verwenden versuchen:
Can I use Visual Studio 2010's C++ compiler with Visual Studio 2008's C++ Runtime Library?
How to Enforce C++ compiler to use specific CRT version?
VS 2008 - Link against older C runtime

ich Kev Dwyer danken möchte (für den Hinweis auf Bedeutung der Version von VS was verwendet wird) und Stefan Behnel (um mich auf distutils als einen Ort zu verweisen, der sich mit der Konfiguration des Compilers beschäftigt) im Thread Problem building lxml under Windows - error: Unable to find vcvarsall.bat auf der Mailingliste lxml. Ich möchte auch agronholm von freenode #distutils IRC-Kanal für die Bestätigung danken, dass distutils Code enthält, der nach vcvarsall.bat Datei sucht.

+16

in Ordnung, erklärt man es, aber so was muss in Abwesenheit von VS2008 getan werden? – Maysam

+0

@Maysam Sie sollten ** nichts anderes als Visual Studio 2008 dafür verwenden. –

+30

Ok lange und Antwort Wickel ... Aber es ist immer noch nicht erklären, wie eigentlich das Problem zu beheben, dass der Mann hat? –

4

Nach dem Anschluss an die empfohlene Lösung:

  1. Herunterladen VCForPython27.msi von Microsoft,
  2. Installation it (Win7, Python (x, y) 2.7.9 32bit),
  3. Eingabe/Aktualisierung der Umgebungsvariable VS90COMNTOOLS zu das Installationsverzeichnis Wert (C: \ Program Files (x86) \ Gemeinsam Files \ Microsoft \ Visual C++ für Python \ 9.0)

mein Problem bestand immer noch (möchte eine Python-Erweiterung in C bauen).

Ich hatte das folgende 2 unglaublich schmutzig zwickt zu tun, vor allem jetzt in der Tat funktioniert:

  1. ändern "msvc9compiler.py" in "C: \ Python27 \ Lib \ distutils", Funktion find_vcvarsall, weisen auf jetzt "Visual C++ für Python" statt zu "VC".
  2. kopieren Sie die Verzeichnisse Gründer unter "C: \ Program Files (x86) \ Gemeinsame Files \ Microsoft \ Visual C++ für Python \ 9.0 \" zu „C: \ Program Files (x86) \ Gemeinsame Dateien \ Microsoft \ Visual C++ für Python \ " (dh ein Verzeichnis Ebene höher).

Ich kann nicht sagen, wer hier falsch, etwas zu tun war - wahrscheinlich I.

EDIT. Das Verschieben von Verzeichnissen funktioniert aufgrund des in this distutils bug beschriebenen Problems.

even if VS90COMNTOOLS is set, msvc9compiler isn't able to find vcvarsall.bat because it is installed in %installdir%/vcvarsall.bat and not %installdir%/VC/vcvarsall.bat

Das beschriebene Problem zu umgehen, die Visual C++ Eingabeaufforderung verwendet:

  1. Enter MSVC for Python command prompt

  2. SET DISTUTILS_USE_SDK=1

  3. SET MSSdk=1

  4. python.exe setup.py ...

3

Jorj McKie war fast richtig: in der Tat VCForPython27.msi Installation ist nicht genug, und ja, es gibt ein Problem in distutils, die es verhindert, finde find_vcvarsall. Tatsächlich ist das Problem nicht direkt in distutils, sondern darin, wie VCForPython27.msi gepackt wurde und wo vcvarsall.bat platziert wurde (das Layout der Ordner unterscheidet sich vom VS2008 SDK).

Eine einfache Problemumgehung, während dies vielleicht in Python 2.7.11 gepatcht wird: Verwenden Sie setuptools anstelle von distutils.

Ein anderes Handbuch Abhilfe, wenn Sie mit distutils stecken:

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 ... 

Bugreport und Abhilfe von Gregory Szorc: http://bugs.python.org/issue23246

Mehr Infos und eine Abhilfe für die Verwendung von %% cython Magie innen IPython: https://github.com/cython/cython/wiki/CythonExtensionsOnWindows