17

我正在开始一些文字处理项目,我需要 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 上交叉编译吗?(对 Android SDK 使用与 Google 相同的方法)

4

5 回答 5

32

更新:这个答案现在已经超过 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以直接pip在任何 shell 中使用来自 SDK v7.0 的 x64 编译器,而不是使用 SDK shell 以及设置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

使用 distutilspipeasy_install. 请参阅带有 pip、MSVC 2008 Express 和 SDK 7 的 Python x64 包扩展

注意:您可以安装使用来自 Christoph Gohlke 的英特尔 MKL 优化的 Numpy。对于 virtualenv,尝试将二进制分发 Windows 安装程序转换为可以使用 pip安装的轮文件。从源代码构建NumPy并非易事随着OpenBLAS ( GotoBLAS的一个分支)的最近推出和可用性,这已成为一种可能。有适用于 Windows x86 和 x86-64 的优化二进制文件以及比 GotoBLAS 或ATLAS更易于编译的源代码。

注意:过去我不建议从源代码编译 NumPy,因为您必须为您的平台优化 BLAS,这非常耗时,并且参考 BLAS (FORTRAN) 或 CBLAS (C/C++) 实现的性能相对较低. NumPy 还依赖于LAPACK,LAPACK 也依赖于 BLAS,这是构建 NumPy 的额外障碍。但是 OpenBLAS 二进制文件已经用 LAPACK 编译,所以这个障碍已经被消除了。请参阅Carl Kleffner 的静态 MinGW-w64 工具链以在 Windows 上使用 OpenBLAS 构建 NumPy - 他解决了一些 ABI 不兼容问题以及链接到正确的 Microsoft Visual C Common Runtime 库(msvcr90.dll适用于 Python-2.7)的问题。

那么接下来是关于在 Windows 7 x64 上安装 Python 扩展的主要问题。

编译扩展的推荐方法是使用与编译 Python 共享库 [1-3] 相同的编译器。用于 Windows的官方 Python 2.7.x是使用Microsoft Visual Studio 2008 Professional 中的 Microsoft Visual C++ 编译器版本 9.0 [4](又名 MSVC90 或简称 VC90)编译的,您可以从Microsoft DreamSpark免费获得。显然 x64 编译器默认没有安装,因此请确保它们与 x86 编译器一起安装。注意:MS Visual Studio 2008 可能不再可用,但 MS Visual Studio 2010 将允许您使用 MSVC90 工具链(如果已安装,可从 Windows SDK7 安装)。

当你从命令行执行 python 解释器时,你可以通过查看标题来判断你的 Python 是用什么版本构建的。eg :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的不是相同msvcr90.dll或更高版本的.

如果您想免费使用,您可以使用Microsoft Visual C++ 2008 Express SP1,但您需要为 .NET Frameworks 3.5 SP1 添加 Windows SDK 7,因为 express 版本没有x64编译器。使用 VS2008 Express & SDK 7 安装 x64 C++ 扩展的过程与cython 站点上的 windows x64 扩展非常相似。注意: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 编译扩展,方法是按照参考文档和 wiki 发布在各个地方的说明:

  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 环境变量的类型(与默认的 debug 或 x86 相比)。

  4. 键入set DISTUTILS_USE_SDK=1hit return 然后键入set MSSdk=1并返回以告知distutils.msvccompiler您正在使用 SDK,并且 SDK 将确定所有环境变量。
  5. 现在使用您选择的安装方法:
    • pip install pyyaml ntlk这是推荐的方式,请参阅 ntlk,但您必须安装setuptoolspip
    • python setup.py install对于每个下载、提取的 tarball
    • easy_install pyyaml ntlk这是安装鸡蛋的旧方法和唯一方法。

[1]在 Windows 上构建 C 和 C++ 扩展
[2] distutils.msvccompiler — Microsoft 编译器
[3] Python 开发指南:入门:Windows
[4]这个 python 是用什么版本的 Visual Studio 编译的

于 2012-12-06T20:07:20.110 回答
13

自其他答案以来,微软已经发布了一个编译器包,专门用于为 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 版本和这个编译器包的组合应该很容易做到这一点。

于 2014-11-21T16:21:03.923 回答
0

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

  1. 使用 mingw 构建
  2. 使用 VS 2008 express 构建 python 2.7。
  3. 我不确定哪个版本适合构建 3.2,但它可能是 VS 2010。
  4. 你可以使用你想要的 VS 从源代码编译 python x64,但是你会遇到与其他预构建包的竞争力问题。
于 2012-07-01T20:18:39.833 回答
0

这对我最有效:

  1. 安装Visual Studio Express 2008
  2. Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1http://www.microsoft.com/en-us/download/details.aspx?id=3138安装
  3. 前往C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin并打开Visual Studio 2008 x64 Win64 Command Prompt
  4. 在那个外壳中,运行pip install <package>

以这种方式完成后,您不必在客户端系统上安装任何可再发行包。

于 2015-08-26T19:37:34.093 回答
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,没有“如果”,只是

      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
    

以上某些内容可能不是最佳位置,但它让我的扩展工作......

于 2016-07-14T12:22:52.520 回答