Visual Studio 在Windows x64上编译Python模块

yzuktlbb  于 2022-11-17  发布在  Windows
关注(0)|答案(6)|浏览(156)

我开始了一些项目在文字处理,我需要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 for Android SDK相同的方法)

fumotvh3

fumotvh31#

***更新:*这个答案已经超过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,也可以安装包含VC-14.0的新版MS build tools for 2017-单击链接,然后向下滚动,直到找到同样包含VC-14.0的Visual Studio 2017构建工具。

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。*
  • 注意事项 *:您可以安装Christoph Gohlke提供的使用英特尔MKL优化的Numpy。对于virtualenv,请尝试将二进制分发版Windows安装程序转换为可使用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,而LAPACK又依赖于BLAS,这是构建NumPy的另一个障碍。但是,OpenBLAS二进制文件已经使用LAPACK编译,所以这个障碍已经被消除了。请参见Carl Kleffner's static MinGW-w64 toolchains to build NumPy with OpenBLAS on Windows-他解决了一些ABI不兼容问题和链接到正确的Microsoft Visual C公共运行库的问题(msvcr90.dll for Python-2. 7)。

现在我们来讨论一下关于在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将允许您使用MSVC 90工具链,该工具链可从Windows SDK 7安装。*
当你从命令行执行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应用程序,而不适用于AMD 64/x86-64。

  • 创建一个distutils配置文件来指定mingw编译器,
  • remove the -mno-cygwin bug from distutils.cygwinccompiler.Mingw32ccompiler
  • 使用pexports.exe从msys或gendef.exe从msys 2导出一个库定义文件,并使用dlltool.exe(msys/msys 2)创建一个静态库libpython27.a(但是最新版本的官方Python for Windows已经在Python27\lib文件夹中有这个文件,谢谢!)。

但是,最终您 * 仍然 * 需要链接到构建python时使用的运行时msvcr90.dll,因此您将需要Visual C++ 2008 redistributable。* 注意:来自mingw-w 64的Windows GCC使用msvcrt.dll,这与msvcr90.dll或更高版本不同。*
如果你想免费安装,你可以使用Microsoft Visual C++ 2008 Express SP1,但你需要添加Windows SDK 7 for .NET Frameworks 3.5 SP1,因为Express版本没有x64编译器。使用VS 2008 Express & SDK 7安装x64 C++扩展的过程与cython site for windows x64 extensions上的过程非常相似。* 注意:不再提供或不再支持MS Visual Studio 2008学习版。*
仅供参考:您不一定需要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优化的命令窗口。
1.第1步相当于从开始菜单或命令提示符(aka 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编译器未安装的消息。
1.然后键入setenv /Release /x64,这将设置专门用于Windows 7 x64版本的SDK环境变量(相对于默认的debug或x86)。
1.键入set DISTUTILS_USE_SDK=1并按回车键,然后键入set MSSdk=1并按回车键,以告诉distutils.msvccompiler您正在使用SDK,并且SDK将确定所有环境变量。

  • 现在使用您选择的安装方法:
  • pip install pyyaml ntlk,这是建议的方式,see ntlk,但您必须安装setuptoolspip
  • python setup.py install,用于每个已下载、已解压缩的压缩包
  • easy_install pyyaml ntlk这是旧的方法,也是安装egg的唯一方法。

[1][Building C and C++ Extensions on Windows](http://docs.python.org/2/extending/windows.html)显示器
[2]微软编译器
[3]Python开发指南:开始使用:视窗
[4][What version of visual studio is this python compiled with](https://stackoverflow.com/questions/2676763/what-version-of-visual-studio-is-this-python-compiled-with)显示器

qvk1mo1f

qvk1mo1f2#

在其他的答案之后,微软发布了一个编译器包,专门用于构建Python 2.7(以及任何使用VS 2008/VC 9的Python版本)的扩展。
1.转到http://aka.ms/vcpython27,下载并安装软件包(它相当小,不需要管理员权限)
1.将setuptools更新到6.0或更高版本(pip install -U setuptools
1.安装软件包(pip install <whatever>
最新的setuptools版本和这个编译器包的组合应该会让这件事变得非常容易。

6mw9ycah

6mw9ycah3#

显然有几种方法可以做到。
1.使用mingw构建
1.使用VS 2008 Express构建Python 2.7。
1.我不知道哪个版本是好的建立3.2,但它可能是VS 2010。
1.你可以使用你想要的VS从源代码编译python x64,但是你会遇到与其他预构建包的兼容性问题。

eqzww0vc

eqzww0vc4#

这对我来说效果最好:
1.安装Visual Studio Express 2008
1.从http://www.microsoft.com/en-us/download/details.aspx?id=3138安装Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1
1.转到C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin并打开Visual Studio 2008 x64 Win64 Command Prompt
1.在该shell中,运行pip install <package>
这样做时,您应该不必在客户端系统上安装任何可再分发的软件包。

xuo3flqw

xuo3flqw5#

对于Windows 10、Python 2.7.11、Cygwin 2.5.2和x86_64-w 64-mingw 32-gcc 4.9.2或5.4.0(但请参见下面1下的note),将其他地方的注解整合在一起,下面是我必须为Python扩展做的事情,以编译、链接和克服msvcrt.dll和msvcr90.dll之间的争用条件:

  • 编辑distutils/cygwinc编译器,并在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-w 64-mingw 32-gcc 5.4.0,似乎不使用 * msvcr 90时效果更好,因此使对get_msvcr的调用有条件:

if self.gcc_version < '5':
            self.dll_libraries = get_msvcr()
  • 请使用setup.py,其中包含以下内容
libdirs=['C:\\Python27\\libs',...]
macros=[('MS_WIN64','1'),...]
platform="WIN32"
  • 修补一个源文件头以包含
#ifdef MS_WIN64
#define strdup _strdup
#endif
  • 最后,
/c/Python27/python [editted setup].py -v build --compiler=mingw32
 /c/Python27/python [editted setup].py -v install

上面的一些可能不是很好的地方,但它让我的扩展工作...

gorkyyrv

gorkyyrv6#

如何在Visual Studio代码上安装nltk?我正在训练编写pip安装nltk,但没有成功😣😣,我真的需要帮助

相关问题