Kompilowanie modułów Pythona w systemie Windows x64

Zaczynam kilka projektów w przetwarzaniu słów i potrzebowałem NumPy i NLTK. To był pierwszy raz, kiedy poznałem easy_install i jak skompilować nowy moduł Pythona do systemu.

Mam Pythona 2.7 x64 plus VS 11 I VS 12. Również Cygwin (chyba ostatni). Widziałem w pliku, który kompiluje za pomocą VS, że szuka VS env z tą samą wersją, co ta, która skompilowała kod Pythona, dlaczego? Kiedy na twardo zakodowałem 11.0, który jest moją wersją, numpy nie udało się zbudować na kilka dziwnych błędów dotyczących vcvarsall (znalazł vcvarsall, prawdopodobnie źle go użył).

Czy nie mogę budować binariów Pythona na Windows? Jeśli nie, Czy Mogę kompilować krzyżowo na Linuksie Dla Windows? (przy użyciu tej samej metody co Google dla Android SDK)

Author: Cristian Ciupitu, 2012-06-29

5 answers

Aktualizacja: ta odpowiedź ma już ponad 5 lat! Python-2.7 ma być przestarzały, więc naprawdę potrzebujesz kompilatora Microsoft Visual C dla Pythona-3. Zajrzyj do tej Pythonowej wiki na kompilatorach MS Windows. MS Build Tools 2015 z VC-14.0 jest tym, czego potrzebujesz do budowania rozszerzeń dla Pythona-3.5 i 3.6. Możesz zainstalować starsze MS Build tools 2015, które zawiera VC-14.0 lub nowsze MS build tools dla 2017 - kliknij link, następnie przewiń w dół, aż znajdziesz narzędzia do budowania Visual Studio 2017 - które obejmuje również VC-14.0.

również jeśli Twoje wersje pip i setuptools są aktualne, możesz zignorować wszystkie te głupie, stare bzdury MSSDK. Szczególnie jeśli używasz VC dla Pythona 2.7 lub MS build tools 2015. Od setuptools-24, po prostu wie, gdzie szukać tych kompilatorów, miejmy nadzieję.

Update: As Zooba wspomina poniżej, darmowe Kompilatory x86 i AMD64 (x86-64) VC90 dla Pythona-2.7 są już dostępne od Microsoftu.

Aktualizacja: Patch vcvarsall.bat aby używać kompilatorów x64 z SDK v7. 0 bezpośrednio z pip W dowolnej powłoce, zamiast używać powłoki SDK i ustawiać zmienne środowiskowe DISTUTILS_USE_SDK i MSSdk, jak w kierunkach poniżej. Zobacz napraw vcvarsall.bat do instalacji rozszerzeń Pythona-2.7 x64 z v90 zamiast sdk7 .

tl; dr: Użyj Windows Kompilatory SDK v7. 0, Otwórz powłokę SDK i wywołaj

C:\> setenv /release /x64
C:\> set DISTUTILS_USE_SDK=1
C:\> MSSdk=1

aby zbudować Pythona 2.7.rozszerzenia x za pomocą distutils, pip lub easy_install. Zobacz rozszerzenia pakietu Python x64 z pip, MSVC 2008 Express & SDK 7 .

Uwaga : można zainstalować Numpy zoptymalizowane za pomocą Intel MKL z Christoph Gohlke . W przypadku virtualenv, spróbuj przekonwertować instalator dystrybucji binarnej windows do pliku wheel , który można zainstalować za pomocą pip. Budynek NumPy ze źródła jest a nie trywialne. Jest to możliwe dzięki wprowadzeniu i udostępnieniu OpenBLAS, widelca GotoBLAS. Istnieją zoptymalizowane binaria dostępne dla Windows x86 i x86-64, a także źródła, które jest stosunkowo prostsze do skompilowania niż GotoBLAS lub ATLAS.

Uwaga: w przeszłości nie zalecałem kompilacji NumPy ze źródła, ponieważ trzeba było zoptymalizować BLAS dla swojego platforma, która była bardzo czasochłonna, a implementacje referencyjne BLAS (FORTRAN) lub CBLAS (C / C++) były stosunkowo mało wydajne. NumPy również zależy od LAPACK , który również zależy od BLAS dodatkową przeszkodą w budowaniu NumPy. Jednak binaria OpenBLAS są już skompilowane z LAPACK, więc ta przeszkoda została już usunięta. Zobacz statyczne łańcuchy narzędzi MinGW-w64 Carla Kleffnera do budowania NumPy z openblas na Windows - rozwiązał on niektóre z ABI niezgodności i problemy związane z poprawną biblioteką Microsoft Visual C Common Runtime (msvcr90.dll dla Pythona-2.7).

Przejdźmy więc do głównego pytania o instalowanie rozszerzeń Pythona w Windows 7 x64.

Zalecanym sposobem kompilowania rozszerzeń jest użycie tego samego kompilatora, którego użyto do kompilacji Biblioteki współdzielonej Pythona [1-3]. oficjalny Python 2.7.x Dla Windows został skompilowany przy użyciu kompilatorów Microsoft Visual C++ w wersji 9.0 [4] (aka MSVC90 lub po prostu VC90) z Microsoft Visual Studio 2008 Professional , który być może będzie można uzyskać za darmo z Microsoft DreamSpark . Ewidentnie Kompilatory x64 nie są instalowane domyślnie, więc upewnij się, że są instalowane razem z kompilatorami x86. Uwaga: MS Visual Studio 2008 może nie być już dostępne, ale MS Visual Studio 2010 pozwoli Ci korzystać z pakietu narzędzi MSVC90, jeśli jest zainstalowany, który można zainstalować z Windows SDK7.

Możesz powiedzieć, jaką wersję masz Python został zbudowany przez patrząc na nagłówek podczas wykonywania interpretera Pythona z linii poleceń. np.: Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32 oznacza to, że został zbudowany z VS 2008 C++. Możesz zbudować Pythona samodzielnie ze źródła, ale jest to również żmudne zadanie. Ogólnie nie zaleca się mieszania środowisk kompilatora, chociaż w praktyce może się okazać, że nadal działają.

Jeśli masz serce nastawione na używanie GNU GCC , musisz użyć MinGW-w64 , ponieważ MinGW jest tylko dla natywnych aplikacji x86, a nie AMD64/x86-64. Będziesz musiał

Jednak w końcu nadal będziesz musiał połączyć się z runtime, z którym został zbudowany python, msvcr90.dll, więc będziesz potrzebował Visual C++ 2008 redistributable. Uwaga: Windows GCC od mingw-w64 używa msvcrt.dll co nie jest tym samym co msvcr90.dll lub później .

Jeśli chcesz to zrobić za darmo możesz użyć Microsoft Visual C++ 2008 Express SP1 ale musisz dodać Windows SDK 7 dla.NET Framework 3.5 SP1, ponieważ wersja express nie ma , a nie kompilatorów x64. Procedura instalacji rozszerzeń x64 C++ z VS2008 Express i SDK 7 jest bardzo podobna do tych na stronie cython dla rozszerzeń windows x64 . Uwaga: program MS Visual Studio 2008 Express nie jest już dostępny ani obsługiwany.

FYI: niekoniecznie potrzebujesz Visual Studio do tworzenia przy użyciu Microsoft Kompilatory. Są one dostępne bezpłatnie z odpowiednim pakietem SDK. CL.EXE jest wykonywalnym kompilatorem, ale będziesz musiał ustawić dowolne opcje platformy, które są normalnie skonfigurowane przez Autotools lub inne narzędzie, takie jak CMAKE. CMAKE dobrze gra z MSVC, ale Autotools AFAIK nie działa z MSVC i wymagałby środowiska POSIX i narzędzi, które w systemie Windows są dostępne w MSYS .

Dla wielu pakietów Pythona, które używają distutils lub setuptools, mogą kompilować rozszerzenia korzystające z Windows SDK 7, postępując zgodnie ze wskazówkami zamieszczonymi w różnych miejscach za pośrednictwem dokumentacji referencyjnej i wiki:]}

  1. z menu Start wybierz Wszystkie programy następnie Microsoft Windows SDK v7.0 i uruchom cmd Shell , aby otworzyć okno poleceń zoptymalizowane dla Windows SDK.
  2. Krok #1 jest odpowiednikiem wpisania w polu Run z menu Start lub z Wiersz polecenia (aka C:\Windows\System32\cmd.exe):

    %COMSPEC% /E:ON /V:ON /K "%PROGRAMFILES%\Microsoft SDKs\Windows\v7.0\Bin\SetEnv.cmd"
    

    Uwaga: flagi /E:ON, które włączają rozszerzenia poleceń, oraz /V:ON, które umożliwiają rozszerzanie zmiennych z opóźnieniem, są niezbędne do działania SetEnv.cmd, w przeciwnym razie otrzymasz komunikat, że Kompilatory x64 nie są zainstalowane, & c.

  3. Następnie wpisz setenv /Release /x64, który ustawi zmienne środowiskowe SDK specjalnie dla wydania Windows 7 x64(vs debug lub x86, które są domyślne).

  4. Type set DISTUTILS_USE_SDK=1 hit return and następnie wpisz set MSSdk=1 I return, aby powiedzieć distutils.msvccompiler, że używasz SDK i że SDK określi wszystkie zmienne środowiskowe.
  5. teraz użyj wybranej metody instalacji:
    • pip install pyyaml ntlk który jest zalecanym sposobem, zobacz ntlk , ale musisz mieć setuptools i PIP zainstalowane.
    • python setup.py install dla każdego pobranego, wyodrębnionego tarballa
    • easy_install pyyaml ntlk który jest starym sposobem i jedynym sposobem instalacji jajka.

[1] tworzenie rozszerzeń C i C++ w systemie Windows
[2] distutils.msvccompiler-kompilator Microsoft
[3] Python Dev Guide: Getting Started: Windows
[4] z jaką wersją visual studio jest skompilowany ten python

 29
Author: Mark Mikofski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-26 04:25:40

Od czasu innych odpowiedzi, Microsoft wydał pakiet kompilatora specjalnie do budowania rozszerzeń dla Pythona 2.7 (i każdej wersji Pythona, która używała VS 2008 / VC9). Oto jak go używać:

  1. Przejdź do http://aka.ms/vcpython27, Pobierz i zainstaluj pakiet (jest dość mały i nie wymaga uprawnień administratora)

  2. Zaktualizuj setuptools do wersji 6.0 lub nowszej (pip install -U setuptools)

  3. Zainstaluj pakiet (pip install <whatever>)

The połączenie najnowszej wersji setuptools i tego pakietu kompilatora powinno ułatwić to zadanie.

 11
Author: Zooba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 16:53:12

Jest kilka sposobów, aby to zrobić.

  1. Zbuduj za pomocą mingw
  2. Zbuduj Pythona 2.7 używając VS 2008 express.
  3. nie jestem pewien, która wersja jest dobra do zbudowania 3.2, ale może to być VS 2010.
  4. możesz skompilować Pythona x64 ze źródła używając pożądanego VS, ale będziesz miał problemy z konkurencją z innymi wstępnie zbudowanymi pakietami.
 0
Author: codeScriber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-01 20:18:39

To działało najlepiej dla mnie:

  1. Install Visual Studio Express 2008
  2. zainstaluj Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 z http://www.microsoft.com/en-us/download/details.aspx?id=3138
  3. przejdź do C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin i otwórz Visual Studio 2008 x64 Win64 Command Prompt
  4. in that shell, run pip install <package>

Nie powinieneś instalować żadnych pakietów redystrybucyjnych na systemach klienckich, gdy jest to zrobione w ten sposób.

 0
Author: frmdstryr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-26 19:37:34

Dla Windows 10, Python 2.7.11, Cygwin 2.5.2 i x86_64-W64-mingw32-gcc 4.9.2 lub 5.4.0 (ale patrz uwaga poniżej 1), ściągając komentarze z innego miejsca, oto co musiałem zrobić dla mojego rozszerzenia Pythona, aby skompilować, połączyć i pokonać stan wyścigu między msvcrt.dll i msvcr90.dll:

  1. Edit distutils / cygwinccompiler, and in class Mingw32CCompiler

    • Zastąp starą poprawkę-MNO-cygwin na

      if self.gcc_version < '4' or is_cygwingcc():
        no_cygwin = ' -nostdlib -lgcc'
      

      Dla gcc 4.9.2 -- uwaga dla 5.4.0, no 'if', just

      no_cygwin = ''
      
    • Pobierz odpowiedni kompilator na miejsce:

              self.set_executables(compiler='x86_64-w64-mingw32-gcc%s -O -Wall' % no_cygwin,
                       compiler_so='x86_64-w64-mingw32-gcc%s -mdll -O -Wall' % no_cygwin,
                       compiler_cxx='x86_64-w64-mingw32-g++%s -O -Wall' % no_cygwin,
                       linker_exe='x86_64-w64-mingw32-gcc%s' % no_cygwin,
                       linker_so='x86_64-w64-mingw32-%s%s %s %s'
      
    • Uwaga dla x86_64-W64-mingw32-gcc 5.4.0, wydaje się działać lepiej BEZ msvcr90, więc wykonaj wywołanie get_msvcr warunkowe:

              if self.gcc_version < '5':
                  self.dll_libraries = get_msvcr()
      
  2. Użyj setup.py z następującym

    libdirs=['C:\\Python27\\libs',...]
    macros=[('MS_WIN64','1'),...]
    platform="WIN32"
    
  3. Popraw jeden z moich nagłówków plików źródłowych, aby zawierał

    #ifdef MS_WIN64
    #define strdup _strdup
    #endif
    
  4. Wreszcie,

     /c/Python27/python [editted setup].py -v build --compiler=mingw32
     /c/Python27/python [editted setup].py -v install
    

Niektóre z powyższego może nie być w całkiem optymalnym miejscu, ale to ma moje rozszerzenie działa...

 0
Author: HST,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 14:06:57