簡體   English   中英

在Windows x64上編譯Python模塊

[英]Compiling Python modules on Windows x64

我正在開始一些文字處理項目,我需要NumPy和NLTK。 這是我第一次了解easy_install以及如何將python的新模塊編譯到系統中。

我有Python 2.7 x64加VS 11和VS 12.還有Cygwin(我猜的最新版本)。 我可以在使用VS編譯的文件中看到它使用與編譯python代碼的版本相同的版本查找VS env,為什么? 當我硬編碼11.0這是我的版本時,numpy無法建立幾個關於vcvarsall奇怪錯誤(它發現了vcvarsall ,可能誤用了它)。

我不能在Windows上構建python二進制文件嗎? 如果沒有,我可以在Linux for Windows上交叉編譯嗎? (使用與Google相同的Android SDK方法)

更新:這個答案已經超過5年了! Python-2.7即將被棄用,所以你真正需要的是用於Python-3的Microsoft Visual C編譯器。 在MS Windows編譯器上查看這個Python wiki 使用VC-14.0的MS Build Tools 2015是構建Python-3.5和3.6擴展所需的。 您可以安裝包含VC-14.0的舊版MS構建工具20152017年的較新MS構建工具 - 單擊該鏈接,然后向下滾動,直到找到Visual Studio 2017的構建工具 - 其中還包括VC-14.0。

此外,如果您的pip和setuptools版本是最新的,那么你可以忽略所有這些愚蠢的舊學校MSSDK廢話。 特別是如果您使用VC for Python 2.7或MS構建工具2015.自setuptools-24以來,它只知道在哪里尋找這些編譯器,希望如此。

更新:正如Zooba在下面提到的, 現在可以從Microsoft免費獲得用於Python-2.7的免費x86和AMD64(x86-64)VC90 c編譯器

更新: 修補vcvarsall.bat直接使用SDK v7.0中的x64編譯器,在任何shell中使用pip ,而不是使用SDK shell,並MSSdk以下說明設置DISTUTILS_USE_SDKMSSdk環境變量。 請參閱修復vcvarsall.bat以使用v90而不是sdk7安裝Python-2.7 x64擴展

tl; dr:使用Windows SDK v7.0編譯器,打開SDK shell並調用

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

使用distutils, pipeasy_install構建Python 2.7.x擴展。 請參閱使用pip,MSVC 2008 Express和SDK 7的Python x64 Package Extensions

注意 :您可以使用Christoph Gohlke的英特爾MKL安裝Numpy優化 對於virtualenv,嘗試將二進制分發窗口安裝程序轉換為可以使用pip安裝的wheel文件。 從源代碼構建NumPy 非易事。 它已成為近期的引進和可用性的可能性OpenBLAS的叉子GotoBLAS 針對Windows x86和x86-64的優化二進制文件以及比GotoBLAS或ATLAS編譯相對簡單的源代碼。

注意 :過去我沒有建議從源代碼編譯NumPy,因為你必須為你的平台優化BLAS,這是非常耗時的,並且參考BLAS(FORTRAN)或CBLAS(C / C ++)實現的性能相對較低。 另外NumPy依賴於LAPACK ,這也取決於BLAS構建NumPy的額外障礙。 但是OpenBLAS二進制文件已經用LAPACK編譯,所以這個障礙已經被刪除了。 請參閱Carl Kleffner的靜態MinGW-w64工具鏈,在Windows上使用OpenBLAS構建NumPy - 他已經解決了一些ABI不兼容問題以及鏈接到正確的Microsoft Visual C Common Runtime庫(Python-2.7的msvcr90.dll )的問題。

那么關於在Windows 7 x64上安裝Python擴展的主要問題。

編譯擴展的推薦方法是使用用於編譯Python共享庫的相同編譯器[1-3]。 官方Python 2.7.x for Windows是使用Microsoft Visual C ++編譯器9.0 [4](又名MSVC90或簡稱VC90)從Microsoft Visual Studio 2008 Professional編譯的 ,您可以從Microsoft DreamSpark免費獲得。 顯然,默認情況下不安裝x64編譯器,因此請確保它們與x86編譯器一起安裝。 注意:MS Visual Studio 2008可能不再可用,但MS Visual Studio 2010將允許您使用MSVC90工具鏈(如果已安裝),可以從Windows SDK7安裝。

通過從命令行執行python解釋器時查看標題,可以確定Python的構建版本。 例如Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32 :24: Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32意味着它是使用VS 2008 C ++構建的。 您可以從源代碼自己構建Python,但這也是一項艱巨的任務。 一般情況下,不建議混合編譯器運行時,盡管在實踐中您可能會發現它們仍然有效。

如果您已經開始使用GNU GCC ,那么您必須使用mingw-w64,因為MinGW僅適用於本機x86應用程序,而不適用於AMD64 / x86-64。 你需要

但是最后你仍然需要鏈接python msvcr90.dll構建的運行時msvcr90.dll ,所以你需要Visual C ++ 2008可再發行組件 注意:mingw-w64的Windows GCC使用的msvcrt.dllmsvcr90.dll或更高版本不同

如果你想這樣做免費的,你可以使用微軟的Visual C ++ 2008速成SP1 ,但你將需要添加的Windows SDK 7 .NET框架3.5 SP1 ,因為Express版本具備的x64編譯器。 使用VS2008 Express和SDK 7安裝x64 C ++擴展的過程與用於Windows x64擴展cython站點上的過程非常相似。 注意:MS Visual Studio 2008 Express不再可用或不受支持。

僅供參考:您不一定需要Visual Studio來使用Microsoft編譯器進行構建。 它們可以通過適當的SDK包免費獲得。 CL.EXE是編譯器可執行文件,但您必須設置通常由Autotools或其他工具(如CMAKE)配置的平台選項。 CMAKE可以很好地與MSVC配合使用,但是Autotools AFAIK不能與MSVC一起使用,並且需要一些POSIX環境和Windows上的實用程序在MSYS中可用。

對於許多使用distutils或setuptools的Python包,他們可以通過參考文檔和wiki遵循各個地方發布的指示,使用Windows SDK 7編譯擴展:

  1. 從“ 開始”菜單中選擇“ 所有程序”,然后選擇 Microsoft Windows SDK v7.0”,並啟動CMD Shell以打開針對Windows SDK優化的命令窗口。
  2. 步驟#1相當於從“ 開始”菜單或“命令提示符”(又名C:\\Windows\\System32\\cmd.exe )的“運行”框中鍵入以下內容:

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

    注意:啟用命令擴展的標志/E:ON和啟用延遲變量擴展的/V:ON都是SetEnv.cmd運行所必需的,或者您將收到未安裝x64編譯器的消息, &C。

  3. 然后鍵入setenv /Release /x64 ,它將專門為Windows 7 x64版本設置SDK環境變量(vs debug或x86,這是默認值)。

  4. 鍵入set DISTUTILS_USE_SDK=1單擊返回,然后鍵入set MSSdk=1並返回告訴distutils.msvccompiler您正在使用SDK,並且SDK將確定所有環境變量。
  5. 現在使用您選擇的安裝方法:
    • pip install pyyaml ntlk這是推薦的方法, 請參閱ntlk ,但你必須安裝setuptoolspip
    • 為每個下載的,解壓縮的tarball python setup.py install
    • easy_install pyyaml ntlk這是舊方式和安裝雞蛋的唯一方法。

[1] 在Windows上構建C和C ++擴展
[2] distutils.msvccompiler - Microsoft Compiler
[3] Python開發指南:入門:Windows
[4] 這個python編譯的是什么版本的visual studio

從其他答案開始,Microsoft發布了一個專門用於構建Python 2.7擴展的編譯器包(以及使用VS 2008 / VC9的任何Python版本)。 以下是如何使用它:

  1. 轉到http://aka.ms/vcpython27 ,下載並安裝軟件包(它相當小,不需要管理員權限)

  2. 將setuptools更新到6.0或更高版本( pip install -U setuptools

  3. 安裝你的包( pip install <whatever>

最新的setuptools版本和這個編譯器包的組合應該可以很容易地做到這一點。

有幾種方法可以做到這一點。

  1. 使用mingw構建
  2. 使用VS 2008 express構建python 2.7。
  3. 我不確定哪個版本適合構建3.2,但它可能是VS 2010。
  4. 你可以使用你想要的VS從源代碼編譯python x64,但是你會遇到其他預建包的競爭問題。

這對我來說效果最好:

  1. 安裝Visual Studio Express 2008
  2. http://www.microsoft.com/en-us/download/details.aspx?id=3138安裝Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1
  3. 轉到C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\bin並打開Visual Studio 2008 x64 Win64 Command Prompt
  4. 在該shell中,運行pip install <package>

這樣做時,您不必在客戶端系統上安裝任何可再發行軟件包。

對於Windows 10,Python 2.7.11,Cygwin 2.5.2和x86_64-w64-mingw32-gcc 4.9.2或5.4.0(但請參見下面的注釋 1),將來自其他地方的評論匯總起來,這是我必須做的事情我的Python擴展,用於編譯,鏈接和擊敗msvcrt.dll和msvcr90.dll之間的競爭條件:

  1. 編輯distutils / cygwinccompiler,並在class Mingw32CCompiler

    • 用 - 替換舊的-mno-cygwin修復

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

      對於gcc 4.9.2 - 注意 5.4.0,沒有'if',只是

       no_cygwin = '' 
    • 獲得正確的編譯器:

        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' 
    • 注意 x86_64-w64-mingw32-gcc 5.4.0, 沒有 msvcr90似乎工作得更好,所以調用get_msvcr有條件:

        if self.gcc_version < '5': self.dll_libraries = get_msvcr() 
  2. 使用帶有以下內容的setup.py

     libdirs=['C:\\\\Python27\\\\libs',...] macros=[('MS_WIN64','1'),...] platform="WIN32" 
  3. 修補我要包含的源文件頭之一

     #ifdef MS_WIN64 #define strdup _strdup #endif 
  4. 最后,

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

上面的一些可能不是在最佳位置,但它使我的擴展工作...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM