繁体   English   中英

在Windows x64上编译Python模块

[英]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构建工具20152017年的较新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_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

使用distutils, pipeasy_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 )的问题。

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

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

但是最后你仍然需要链接python msvcr90.dll构建的运行时msvcr90.dll ,所以你需要Visual C ++ 2008可再发行组件 注意:mingw-w64的Windows GCC使用的msvcrt.dllmsvcr90.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. 从“ 开始”菜单中选择“ 所有程序”,然后选择 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这是推荐的方法, 请参阅ntlk ,但你必须安装setuptoolspip
    • 为每个下载的,解压缩的tarball 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版本)。 以下是如何使用它:

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

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

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

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

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

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

这对我来说效果最好:

  1. 安装Visual Studio Express 2008
  2. http://www.microsoft.com/en-us/download/details.aspx?id=3138安装Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1
  3. 转到C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\bin并打开Visual Studio 2008 x64 Win64 Command Prompt
  4. 在该shell中,运行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之间的竞争条件:

  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,没有'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() 
  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 

上面的一些可能不是在最佳位置,但它使我的扩展工作...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM