当前位置:   article > 正文

Windows下在python 2.7中安装fasttext_python2.7 fasttext

python2.7 fasttext

1. 环境信息

OS:windows764bit

Python:2.7.14 [MSCv.1500 64 bit (AMD64)]

2. 安装过程

2.1 安装

1、安装方法有很多,可以直接

pip install fasttext

也可以先clone源码

git clone https://github.com/facebookresearch/fastText.git

2、然后

cd ./fastText
pip install .

或者

python setup.py install

2.2 问题

但是在本文最开始提到的环境中直接安装是不可能成功的

2.2.1 缺少支持python2.7的c++编译器

首先你可能会得到一个错误信息

“error: microsoft visualc++ 9.0 is required”

由于python2.7默认的c++编译器版本是9.0,如果没有此版本的编译器或者开发包会报出这个错误,解决方法很简单,以下两种方法取其一即可:

1、  访问http//aka.ms/vcpython27,下载安装Microsoft提供的编译器

2、  下载visualstudio 2008并安装

但是,安装完了之后依然安装会失败。

2.2.2 “to_string”is not classnumber of std

这是fasttext源码的一个bug,需要在fasttext/src/productquantizer.cc,中加上#include <string>。

如果这时候报错LNK1104: can not open file 'pthread.lib' error. 解决办法是从setup.pyL62中的extra_compile_args去掉-pthread flag

2.2.3 缺少"atomic"头文件

仔细查看报错信息,你会发现,报错提示缺少"atomic"头文件。

但这不是简单的缺失头文件的问题,及时你把这个头文件加进去依旧会有报错。

熟悉C++的同学应该知道,这个头文件引入了原子操作,这是C++11的新特性,然而MS 9.0/VS2008是不支持C++11特性的。

但是fasttext的官方文档中明确说明了其需要C++11的支持。

于是在windows下对于python 2.7安装fasttext就造成了一个矛盾:

Python 2.7使用的是MS 9.0编译器,不支持C++11,然而,fasttext需要C++11的支持

那在windows下,在python 2.7中安装fasttext就不可能了么?并不是

2.3 解决方案

先直接给出解决方案,有兴趣的读者可以继续往下看原因和细节

1、到python安装的地址./Lib/distutils/目录下打开msvc9compiler.py文件

2、找到get_build_version()函数,直接让该函数return14.0。(当然也可以更高,具体数值参考下文中的介绍,当当然,你的机器中得安装有相应的编译器才行。)

3、回到2.1安装fasttext

发现


大功告成

3. 问题解析

整个安装过程中所有的问题归结为一点就是:C++编译器版本问题

由于python 2.7默认的C++编译器是9.0,然而fasttext需要C++11特性,该版本的编译器不支持,所以需要14及以上的编译器版本。

3.1 背景知识

要想理解为什么,需要补充一点背景知识。

3.1.1 编译器的版本

目前,我们使用的Python大部分属于CPython,也就是用C语言实现的Python版本。本质上来讲,无论是在Linux还是Windows平台下,我们使用的都是C编译器编译后的(python)可执行程序。不同点在于,Linux平台源码安装(默认的C编译器一般为gcc)python,C/C++编译环境在本地;Windows平台则通过下载编译好的Python安装使用,本地不一定具备C/C++编译环境。

编译Python使用的编译器版本信息可在python版本信息中查看:

  1. Python2.7.14 |Anaconda custom (64-bit)| (default, Oct 15 2017, 03:34:40) [MSC v.150064 bit (AMD64)] on win32
  2. Type"help", "copyright", "credits" or"license" for more information.
  3. >>>import sys
  4. >>>sys.version
  5. '2.7.14|Anaconda custom (64-bit)| (default, Oct 15 2017, 03:34:40) [MSC v.1500 64 bit(AMD64)]'

为保证兼容性,使用pip给python添加扩展/模块时,如果扩展/模块中包含有C/C++源码,安装脚本将试图寻找与编译生成Python的同版本编译器来编译生成该模块。也就是说在上述两个平台下,Linux平台将寻找并使用GCC 5.4.0 来编译生成Python扩展/模块,Windows平台将寻找并使用Visual C++ 9.0 来编译生成Python扩展/模块。

上面说过,编译生成Python的编译器及版本信息可以在Python的版本信息中查看。通常情况下,Linux平台能够保证Python编译生成环境和Python扩展/模块编译生成环境的一致性,使用中不会存在什么问题。所以本节将主要讨论Windows下的C/C++编译器。

Windows平台下的C/C++编译器默认是Microsoft Visual C++ (下面简称VC)。VC常作为Microsoft Visual Studio(以下简称VS) 开发套件的组成部分在 VS安装时被安装在设备上,我们通常不单独安装VC。特别需要注意的是不同版本的VS搭载不同版本的VC,其对应关系如下:

具体的对应关系


MS 12.0也不能保证完全支持C++11,建议14.0以上版本

3.1.2 Python 获得VC的版本

上面也提到了,python获得VC编译器版本的代码在./Lib/distutils/msvc9compiler.py文件中,代码如下:

  1. defget_build_version():
  2. """Return the version of MSVCthat was used to build Python.
  3. For Python 2.3 and up, the version numberis included in
  4. sys.version. For earlier versions, assume the compiler isMSVC 6.
  5. """
  6. prefix = "MSC v."
  7. i = sys.version.find(prefix)
  8. if i == -1:
  9. return 6
  10. i = i + len(prefix)
  11. s, rest = sys.version[i:].split("", 1)
  12. majorVersion = int(s[:-2]) - 6
  13. minorVersion = int(s[2:3]) / 10.0
  14. # I don't think paths are affected by minorversion in version 6
  15. if majorVersion == 6:
  16. minorVersion = 0
  17. if majorVersion >= 6:
  18. return majorVersion + minorVersion
  19. # else we don't know what version of thecompiler this is
  20. return None

代码比较简单,就不多做解释了。python知道对应的VC版本后,接下了就是找到该版本VC 编译器的物理路径。脚本在寻找VC路径的时候遵循“先注册表,后环境变量”的顺序。对于VC版本>=9.0的情形,脚本通过 HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\VC版本\Setup\VC\ProductDir(64位Python) 或 HKLM\SOFTWARE\Microsoft\VisualStudio\VC版本\Setup\VC\ProductDir (其他情况)键值获取VC编译器的路径。若该键不存在则通过环境变量“VS@0COMNTOOLS” 来确定VC 编译器路径,其中@ 为VC主版本号。具体的寻径策略见msvc9compiler.py(vc_major>8) 或 msvccompiler.py (低版本)。

3.1.3 解决方案分析

有了以上的准备知识,就能很容易理解之前的处理方法了。

Python 2.7使用的是MS 9.0编译器不支持C++11,然而,fasttext需要C++11的支持

既然默认的编译器不能够满足我们的需求,就去手动改掉python获取VC编译器的代码,直接返回用户需要的版本号来解决这个问题。虽然最后看上去很简单,但是从接触到顺利安装fasttext花费了我两天时间,希望这篇帖子能对大家有所帮助。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/967923
推荐阅读
相关标签
  

闽ICP备14008679号