当前位置: 首页 > 面试题库 >

在Windows x64上编译Python模块

汝墨一
2023-03-14
问题内容

我正在开始一些文字处理项目,我需要NumPy和NLTK。那是我第一次知道easy_install如何将新的python模块编译到系统中。

我有Python 2.7 x64加上VS 11和VS12。还有Cygwin(我猜是最新的)。我可以在使用VS进行编译的文件中看到,它查找的VS
env与编译python代码的版本相同,为什么?当我对我的版本11.0进行硬编码时,numpy无法建立关于以下几个奇怪的错误的信息vcvarsall(它发现了vcvarsall,可能是滥用了它)。

我不能在Windows上构建python二进制文件吗?如果没有,我可以在Windows版Linux上交叉编译吗?(使用与Android
SDK的Google相同的方法)


问题答案:

更新: 这个答案已经超过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在任何外壳中使用SDK
v7.0中的x64编译器,而不是按以下说明使用SDK外壳以及设置DISTUTILS_USE_SDKMSSdk环境变量。请参阅Fix
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

使用distutilspip或构建Python 2.7.x扩展easy_install。请参阅带有pip的Python
x64软件包扩展,MSVC 2008 Express&SDK
7。

注意 :您可以使用Christoph Gohlke的Intel
MKL安装经过优化的Numpy。对于virtualenv,请尝试将二进制分发窗口安装程序转换为可以通过pip安装的wheel文件。从源代码构建NumPy

非易事。随着GotoBLAS的分支OpenBLAS的最新推出和上市,它成为可能。有针对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)。

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

当您从命令行执行python解释器时,可以通过查看标头来判断Python的版本。 egPython 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。您将需要

  • 创建一个distutils配置文件以指定mingw编译器,
  • 从distutils.cygwinccompiler.Mingw32ccompiler中删除-mno-cygwin错误,并
  • 使用pexports.exemsys或gendef.exemsys2导出库定义文件,并libpython27.a使用dlltool.exe(msys / msys2)制作一个静态库(但最新的Windows官方Python版本已经在Python27\lib文件夹中包含此文件,谢谢!)。

但是最后,您 仍然 需要链接到构建python的运行时msvcr90.dll,因此您将需要Visual C ++ 2008
redistributable。
注意:mingw-w64使用的Windows
GCCmsvcrt.dllmsvcr90.dll或更高版本不一样。

如果你想这样做免费的,你可以使用微软的Visual C ++ 2008速成SP1,但你将需要添加的Windows SDK 7 .NET框架3.5
SP1,因为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。

  1. 然后输入setenv /Release /x64,它将专门为Windows 7 x64版本(相对于默认为debug或x86)设置SDK环境变量。

  2. 键入set DISTUTILS_USE_SDK=1hit return,然后键入set MSSdk=1并返回,以distutils.msvccompiler表明您正在使用SDK,并且SDK将确定所有环境变量。

  3. 现在使用您选择的安装方法:
    • pip install pyyaml ntlk这是推荐的方法,请参阅ntlk,但是必须安装setuptools和pip。
    • python setup.py install 对于每个下载的,提取的tarball
    • easy_install pyyaml ntlk 这是安装鸡蛋的旧方法,也是唯一方法。

[1]在Windows上构建C和C ++扩展
[2] distutils.msvccompiler-
Microsoft编译器
[3]
Python开发指南:入门:Windows
[4][此python使用哪个版本的VisualStudio?



 类似资料: