我正在开始一些文字处理项目,我需要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 SDK相同的Android SDK方法)
答案 0 :(得分:30)
更新:这个答案已经超过5年了! Python-2.7即将被弃用,所以你真正需要的是用于Python-3的Microsoft Visual C编译器。看看this Python wiki on MS Windows Compilers。使用VC-14.0的MS Build Tools 2015是构建Python-3.5和3.6扩展所需的。您可以安装包含VC-14.0或更新MS build tools 2015的旧版MS build tools for 2017 - 点击该链接,然后向下滚动,直至找到Build Tools for Visual Studio 2017 - 其中还包括VC-14.0。
此外,如果您的pip和setuptools版本是最新的,那么您可以忽略所有这些愚蠢的旧学校MSSDK废话。特别是如果您使用VC for Python 2.7或MS构建工具2015.自setuptools-24以来,它只知道在哪里寻找这些编译器。
更新:正如Zooba所述,free x86 and AMD64 (x86-64) VC90 c-compilers for Python-2.7 are now available from Microsoft。
更新: Patch vcvarsall.bat
在任何shell中直接使用SDK v7.0中的x64编译器与pip
,而不是使用SDK shell并设置DISTUTILS_USE_SDK
}和MSSdk
环境变量如下面的说明。请参阅Fix vcvarsall.bat to install Python-2.7 x64 extensions with v90 instead of sdk7。
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扩展。请参阅Python x64 Package Extensions with pip, MSVC 2008 Express & SDK 7。
注意:您可以安装Numpy optimized using Intel MKL from Christoph Gohlke。对于virtualenv,请尝试将二进制分发窗口安装程序转换为可以使用pip安装的wheel文件。从源代码构建NumPy 不琐碎。最近OpenBLAS的引入和可用性已成为可能,GotoBLAS的分支。有optimized binaries available for Windows x86 and x86-64以及源代码比GotoBLAS或ATLAS编译起来相对简单。
注意:过去我没有建议从源代码编译NumPy,因为你必须为你的平台优化BLAS,这是非常耗时的,并且参考BLAS(FORTRAN)或者CBLAS(C / C ++)实现的性能相对较低。另外NumPy依赖于LAPACK,这也取决于BLAS构建NumPy的额外障碍。但是OpenBLAS二进制文件已经用LAPACK编译,所以这个障碍已经被删除了。请参阅Carl Kleffner's static MinGW-w64 toolchains to build NumPy with OpenBLAS on Windows - 他已解决了一些链接到正确的Microsoft Visual C Common Runtime库(Python {2.7的msvcr90.dll
)的ABI不兼容性和问题。
编译扩展的推荐方法是使用用于编译Python共享库的相同编译器[1-3]。 official Python 2.7.x for Windows是使用Microsoft Visual C++ Compilers version 9.0 [4] (aka MSVC90 or simply VC90) from 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
表示它是使用VS 2008 C ++构建的。您可以从源代码自己构建Python,但这也是一项艰巨的任务。一般情况下,不建议混合使用编译器运行时,但实际上您可能会发现它们仍然有效。
如果您已经开始使用GNU GCC,那么您必须使用mingw-w64,因为MinGW仅适用于本机x86应用程序,而不适用于AMD64 / x86-64。你需要
pexports.exe
from msys or gendef.exe
from msys2 and make a static library libpython27.a
using dlltool.exe
(msys/msys2) (but the newest releases of Official Python for Windows already have this file in the Python27\lib
folder, thanks!)。 但是最终你仍然需要链接python与之构建的运行时msvcr90.dll
,所以你需要Visual C++ 2008 redistributable。 注意:mingw-w64的Windows GCC使用msvcrt.dll
which is not the same as msvcr90.dll
or later。
如果您想免费使用,可以使用Microsoft Visual C++ 2008 Express SP1,但需要添加Windows SDK 7 for .NET Frameworks 3.5 SP1,因为快递版不有x64编译器。使用VS2008 Express和&amp ;;安装x64 C ++扩展的过程。 SDK 7与cython site for windows x64 extensions上的非常相似。 注意:MS Visual Studio 2008 Express不再可用或不受支持。
仅供参考:您不一定需要Visual Studio来使用Microsoft编译器进行构建。它们可以通过适当的SDK包免费获得。 CL.EXE
是编译器可执行文件,但您必须设置通常由Autotools或其他工具(如CMAKE)配置的平台选项。 CMAKE可以很好地与MSVC一起使用,但是Autotools AFAIK不能与MSVC一起工作,并且需要一些POSIX环境和Windows上的实用工具MSYS。
对于许多使用distutils或setuptools的Python软件包,他们可以使用Windows SDK 7编译扩展,方法是通过参考文档和wikis按照各个地方发布的说明进行编译:
步骤#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
这是推荐的方式,see ntlk,但您必须安装setuptools和pip。python setup.py install
easy_install pyyaml ntlk
这是旧方式,也是安装鸡蛋的唯一方法。 [1] Building C and C++ Extensions on Windows
[2] distutils.msvccompiler — Microsoft Compiler
[3] Python Dev Guide: Getting Started: Windows
[4] What version of visual studio is this python compiled with
答案 1 :(得分:11)
自从其他答案以来,Microsoft已经发布了一个专门用于构建Python 2.7扩展的编译器包(以及使用VS 2008 / VC9的任何Python版本)。以下是如何使用它:
转到http://aka.ms/vcpython27,下载并安装软件包(它相当小,不需要管理员权限)
将setuptools更新为6.0或更高版本(pip install -U setuptools
)
安装您的包裹(pip install <whatever>
)
最新的setuptools版本和这个编译器包的组合应该可以很容易地做到这一点。
答案 2 :(得分:0)
显然有几种方法可以做到。
答案 3 :(得分:0)
这对我来说效果最好:
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>
完成此操作后,您不必在客户端系统上安装任何可再发行软件包。
答案 4 :(得分:0)
对于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,没有&#39;如果&#39;,只是
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'
注意,它似乎更好地没有 msvcr90,所以请拨打{{1}有条件的:
get_msvcr
使用带有以下
的setup.py if self.gcc_version < '5':
self.dll_libraries = get_msvcr()
修补我的一个源文件标题以包含
libdirs=['C:\\Python27\\libs',...]
macros=[('MS_WIN64','1'),...]
platform="WIN32"
最后,
#ifdef MS_WIN64
#define strdup _strdup
#endif
上面的一些可能不是最合适的地方,但是我的扩展工作......