在Windows x64上编译Python模块

时间:2012-06-29 18:57:09

标签: python visual-studio python-2.7 compilation windows-7-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 SDK相同的Android SDK方法)

5 个答案:

答案 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 pipeasy_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不兼容性和问题。

关于在Windows 7 x64上安装Python扩展的主要问题。

编译扩展的推荐方法是使用用于编译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。你需要

但是最终你仍然需要链接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. 开始菜单选择所有程序,然后选择 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这是推荐的方式,see ntlk,但您必须安装setuptoolspip
    • 每个下载的,解压缩的tarball
    • python setup.py install
    • easy_install pyyaml ntlk这是旧方式,也是安装鸡蛋的唯一方法。
  6. [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版本)。以下是如何使用它:

  1. 转到http://aka.ms/vcpython27,下载并安装软件包(它相当小,不需要管理员权限)

  2. 将setuptools更新为6.0或更高版本(pip install -U setuptools

  3. 安装您的包裹(pip install <whatever>

  4. 最新的setuptools版本和这个编译器包的组合应该可以很容易地做到这一点。

答案 2 :(得分:0)

显然有几种方法可以做到。

  1. 使用mingw构建
  2. 使用VS 2008 express构建python 2.7。
  3. 我不确定哪个版本适合构建3.2,但它可能是VS 2010。
  4. 你可以使用你想要的VS从源代码编译python x64,但是你会遇到其他预构建软件包的竞争问题。

答案 3 :(得分:0)

这对我来说效果最好:

  1. 安装Visual Studio Express 2008
  2. http://www.microsoft.com/en-us/download/details.aspx?id=3138
  3. 安装Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1
  4. 转到C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin并打开Visual Studio 2008 x64 Win64 Command Prompt
  5. 在该shell中,运行pip install <package>
  6. 完成此操作后,您不必在客户端系统上安装任何可再发行软件包。

答案 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之间:

  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,没有&#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'
      
    • 对于x86_64-w64-mingw32-gcc 5.4.0,
    • 注意,它似乎更好地没有 msvcr90,所以请拨打{{1}有条件的:

      get_msvcr
  2. 使用带有以下

    的setup.py
            if self.gcc_version < '5':
                self.dll_libraries = get_msvcr()
    
  3. 修补我的一个源文件标题以包含

    libdirs=['C:\\Python27\\libs',...]
    macros=[('MS_WIN64','1'),...]
    platform="WIN32"
    
  4. 最后,

    #ifdef MS_WIN64
    #define strdup _strdup
    #endif
    
  5. 上面的一些可能不是最合适的地方,但是我的扩展工作......