python - 在Windows x64上编译Python模块

标签 python visual-studio python-2.7 compilation windows-7-x64

我正在开始一些文字处理项目,我需要numpy和nltk。
这是我第一次了解easy_install以及如何将Python的新模块编译到系统中。
我有python 2.7 x64 plus vs 11和vs 12。还有Cygwin(我猜是最新的一个)。
我可以在使用vs编译的文件中看到,它查找的vs env版本与编译python代码的版本相同,为什么?
当我硬编码11.0(这是我的版本)时,numpy未能建立在有关vcvarsall的几个奇怪错误之上(它发现了vcvarsall,可能误用了它)。
我不能在Windows上构建python二进制文件吗?
如果没有,我可以在LinuxforWindows上交叉编译吗?(使用与Google相同的Android SDK方法)

最佳答案

更新:这个答案已经超过5年了!python-2.7即将被弃用,所以您真正需要的是用于python-3的Microsoft Visual C编译器。看看this Python wiki on MS Windows Compilers。MS Build Tools 2015 with VC-14.0是构建Python-3.5和3.6扩展所需的工具。您可以安装旧的包含VC-14.0的MS build tools 2015,也可以安装新的MS build tools for 2017—单击链接,然后向下滚动,直到找到包含VC-14.0的Build Tools for Visual Studio 2017
此外,如果您的PIP和设置工具版本是最新的,那么您可以忽略所有愚蠢的老学校mssdk胡说八道。尤其是在使用vcforpython2.7或MS构建工具2015时。由于SETUPTOOLS-24,它只知道在哪里查找这些编译器,希望如此。
更新:正如下面提到的,Zooba
更新:free x86 and AMD64 (x86-64) VC90 c-compilers for Python-2.7 are now available from Microsoft以直接在任何shell中使用来自sdk v7.0的x64编译器,而不是使用sdk shell,并按照以下说明设置vcvarsall.batpip环境变量。请参见Patch DISTUTILS_USE_SDK
tl;dr:使用Windowssdkv7.0编译器,打开sdk shell并调用

C:\> setenv /release /x64
C:\> set DISTUTILS_USE_SDK=1
C:\> MSSdk=1

使用distutils、MSSdkpip构建python 2.7.x扩展。请参见Fix vcvarsall.bat to install Python-2.7 x64 extensions with v90 instead of sdk7
注意:您可以安装Python x64 Package Extensions with pip, MSVC 2008 Express & SDK 7。对于virtualenv,请尝试将二进制发行版Windows安装程序转换为可与pip一起安装的Numpy optimized using Intel MKL from Christoph Gohlke文件。从源代码构建wheel并不容易。随着NumPy的推出和可用性,这已成为一种可能性,它是OpenBLAS的一个分支。还有比gotobis或GotoBLAS更容易编译的optimized binaries available for Windows x86 and x86-64和source。
注意:在过去,我没有推荐从源编译NUMPY,因为您必须优化平台的BLA,这是非常密集的,并且参考BLAS(FORTRAN)或CBLAS(C/C++)实现相对较低。同样,numpy依赖于ATLAS这也依赖于blas,这是构建numpy的另一个障碍。然而,openblas二进制文件已经用lapack编译,所以这个障碍已经被消除。请参见LAPACK—他解决了一些ABI不兼容问题,并解决了链接到正确的Microsoft Visual C公共运行库的问题(easy_installfor python-2.7)。
因此,继续讨论有关在Windows7x64上安装Python扩展的主要问题。
编译扩展的推荐方法是使用编译Python共享库[1-3]时使用的编译器。Carl Kleffner's static MinGW-w64 toolchains to build NumPy with OpenBLAS on Windows是使用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中免费获得。显然,X64编译器在默认情况下没有安装,因此请确保它们与X86编译器一起安装。注意:MS Visual Studio 2008可能不再可用,但MS Visual Studio 2010将允许您使用MSVC90工具链(如果已安装),该工具链可以从Windows SDK7安装。
当您从命令行执行Python解释器时,可以通过查看头部来判断您的Python是用什么版本构建的。例如:msvcr90.dll意味着它是用VS 2008 C++构建的。您可以自己从源代码构建Python,但这也是一项艰巨的任务。一般来说,不建议混合使用编译器运行时,尽管在实践中您可能会发现它们仍然有效。
如果您的心脏设置为使用Microsoft DreamSpark,则必须使用GNU GCC,因为mingw-w64仅用于本机x86应用程序,而不是AMD64/x86-64。你需要
MinGW
create a distutils config file to specify the mingw compiler
remove the -mno-cygwin bug from distutils.cygwinccompiler.Mingw32ccompiler
然而,最终,您仍然需要链接到python构建时使用的运行时,Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32,因此您需要export a library definitions file using either 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!)。注意:mingw-w64中的windows gcc使用的是Visual C++ 2008 redistributable
如果您想免费使用,可以使用msvcr90.dll which is not the same as msvcrt.dll or later,但您需要添加Microsoft Visual C++ 2008 Express SP1,因为Express版本没有x64编译器。用VS2008 Express和SDK 7安装X64 C++扩展的过程与Windows SDK 7 for .NET Frameworks 3.5 SP1中的程序非常类似。注意:MS Visual Studio 2008学习版不再可用或不受支持。
仅供参考:您不一定需要使用Microsoft编译器来构建Visual Studio。它们可以通过适当的SDK包免费提供。msvcr90.dll是编译器可执行文件,但您必须设置通常由自动工具或其他工具(如cmake)配置的任何平台选项。cmake在msvc上运行得很好,但是autotools afaik不适用于msvc,需要一些posix环境和实用程序,这些在Windows上可以在cython site for windows x64 extensions中找到。
对于许多使用distuils或setuptools的python包,它们可以使用windows sdk 7编译扩展,方法是遵循参考文档和wikis中在不同位置发布的说明:
从“开始”菜单中选择“所有程序”,然后选择“Microsoft Windows SDK V7.0”,然后启动“命令行解释器”,打开为Windows SDK优化的命令窗口。
步骤1相当于在“开始”菜单或命令提示符(akaCL.EXE)的“运行”框中键入以下内容:
%COMSPEC% /E:ON /V:ON /K "%PROGRAMFILES%\Microsoft SDKs\Windows\v7.0\Bin\SetEnv.cmd"

注意:启用命令扩展的标志C:\Windows\System32\cmd.exe和启用延迟变量扩展的标志/E:ON都是运行/V:ON所必需的,否则您将收到一条消息,说明未安装x64编译器,&c。
然后键入SetEnv.cmd以专门为Windows 7 x64版本设置sdk环境变量(vs debug或x86是默认版本)。
键入setenv /Release /x64hit return,然后键入set DISTUTILS_USE_SDK=1并返回,告诉set MSSdk=1您正在使用sdk,sdk将确定所有环境变量。
现在使用您选择的安装方法:
distutils.msvccompiler这是建议的方式,MSYS,但您必须安装了see ntlksetuptools
对于每个下载的提取的tarball
pip install pyyaml ntlk这是旧方法,也是安装鸡蛋的唯一方法。
[1]pip
[2]Building C and C++ Extensions on Windows
[3]distutils.msvccompiler — Microsoft Compiler
[4]Python Dev Guide: Getting Started: Windows

关于python - 在Windows x64上编译Python模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267463/

相关文章:

python - 实现自定义弹出 tkinter 对话框的正确方法

python - 在 python 中从 JSON 文件创建对象(使用类方法)?

python - 如何使用 Sphinx 从包含表格的 Markdown 渲染 HTML

visual-studio - 从 Visual Studio CLI 构建 SSAS 2016

c# - 如何使 Visual C# 程序自行重启

c# - 无法在 Visual Studio 的 Crystal Report 中加载数据库信息

ios - lldb python basic - 在函数断点内打印全局数组的值

python - DRF导入错误: cannot import name 'action' on v3. 8.2

python - 将日期时间戳转换为本地纪元日期时间

python - 如何使用 Pandas 访问列中的列