[英]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.