[英]Install python modules with Visual Studio 2008 on Windows x64
[英]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構建工具2015或2017年的較新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_SDK
和MSSdk
環境變量。 請參閱修復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, pip
或easy_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
)的問題。
編譯擴展的推薦方法是使用用於編譯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。 你需要
pexports.exe
的pexports.exe或gendef.exe
的gendef.exe導出庫定義文件,並使用dlltool.exe
(msys / msys2)創建一個靜態庫libpython27.a
(但最新版本的官方Python for Windows已經有了這個文件) Python27\\lib
文件夾,謝謝!) 。 但是最后你仍然需要鏈接python msvcr90.dll
構建的運行時msvcr90.dll
,所以你需要Visual C ++ 2008可再發行組件 。 注意:mingw-w64的Windows GCC使用的msvcrt.dll
與msvcr90.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相當於從“ 開始”菜單或“命令提示符”(又名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。
然后鍵入setenv /Release /x64
,它將專門為Windows 7 x64版本設置SDK環境變量(vs debug或x86,這是默認值)。
set DISTUTILS_USE_SDK=1
單擊返回,然后鍵入set MSSdk=1
並返回告訴distutils.msvccompiler
您正在使用SDK,並且SDK將確定所有環境變量。 pip install pyyaml ntlk
這是推薦的方法, 請參閱ntlk ,但你必須安裝setuptools和pip 。 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版本)。 以下是如何使用它:
轉到http://aka.ms/vcpython27 ,下載並安裝軟件包(它相當小,不需要管理員權限)
將setuptools更新到6.0或更高版本( pip install -U setuptools
)
安裝你的包( pip install <whatever>
)
最新的setuptools版本和這個編譯器包的組合應該可以很容易地做到這一點。
有幾種方法可以做到這一點。
這對我來說效果最好:
Visual Studio Express 2008
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1
C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\bin
並打開Visual Studio 2008 x64 Win64 Command Prompt
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之間的競爭條件:
編輯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()
使用帶有以下內容的setup.py
libdirs=['C:\\\\Python27\\\\libs',...] macros=[('MS_WIN64','1'),...] platform="WIN32"
修補我要包含的源文件頭之一
#ifdef MS_WIN64 #define strdup _strdup #endif
最后,
/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.