ZMonster's Blog 巧者劳而智者忧,无能者无所求,饱食而遨游,泛若不系之舟

Windows 上 Python 开发环境搭建


前言

本文会涉及:

  1. Windows 上 Python 开发环境的建立(基于 Cygwin)
  2. Python 开发的一些基础知识
  3. 深度学习框架 Theano 在 Windows 环境下的安装和使用

简单介绍一下 Cygwin: Cygwin 是一个旨在提供 Windows 上的类 Linux 环境的软件,包含了提供 POSIX API 的底层 library 以及大量建立在 POSIX API 上的 GNU 软件和其他开源软件的集合。通过 Cygwin ,可以在不脱离 Windows 环境的情况下获得与 Linux 上一致的开发体验,当然也包括 Python。

Cygwin 的安装

Cygwin 的官网 上下载对应的安装程序,32 位系统就下载 setup-x86.exe,64 位就下载 setup-x86_64.exe —— 现在应该都是 64 位系统了吧。

cygwin_download.png

安装过程很简单,大部分情况下点击下一步进行下去即可。

cygwin_installation_1.png cygwin_installation_2.png

这里可以按自己的需要设置一下 Cygwin 的安装目录,同时在安装完成后,Cygwin 会将这个目录当作根目录(Linux 上的 /)。

cygwin_installation_3.png

安装过程中会从网络上下载各种东西,这里可以设置用于存放这些东西的 临时目录 :

cygwin_installation_4.png

到下面这一步需要选择下载站点,大致上来说选国内的站点速度会快一些,教育网的建议选中科大的源(http://mirrors.ustc.cn/),如图;非教育网的话可以在下面那个「User URL」输入框中填入网易的源(http://mirrors.163.com/cygwin/),点击 Add 后网易的源就会出现在列表中,选中即可。

cygwin_installation_5.png

然后会进入一个更详细的安装页面,一些基础的、必须的软件包已经默认选中了,可以按自己的需要选择一些额外的软件包。

cygwin_installation_6.png

点下一步继续,会开始下载、安装选中的软件包,如无意外,就可以顺利安装上 Cygwin 了。

cygwin_installation_7.png cygwin_installation_8.png cygwin_installation_9.png

至此安装结束,会在桌面上生成 Cygwin 的快捷方式,双击即可打开,正常的话,应该会看到下面这样一个黑乎乎的窗口,其实就是个终端啦。

cygwin_face.png

Cygwin 的界面设置

刚安装好时的 Cygwin 默认外观并不是很好看(当然比 cmd 还是好看一点的……),我们可以通过调整设置来获得一个更让人舒适的外观。

首先是字体,在 Cygwin 的窗口区域右键,选择 Options 会弹出 Cygwin 的设置,如下所示进行字体设置:

cygwin_font_setting.png

这里我选择了 DejaVu Sans Mono 这一款字体,这是我常用的编程字体 —— 以我的标准而言,一款编程用的字体,最低要求是要能区分出一些形状相似的字符,如下图所示:

cygwin_face_2.png

注: 这个字体并不是 Windows 自带的,需要自己下载和安装。

然后,如下图所示,在 Looks 一栏可以设置窗口的透明度

cygwin_ui_setting.png

这是选择透明等级 Med (中等)后的效果

cygwin_med_transparency.png

可以看到右边还有一个 "Glass" 可以选,选择后的效果为

cygwin_glass.png

注意,这里我为了配合透明和 Glass 效果,把窗口的滚动栏去掉了,见设置页面的 Window 一栏。

最后一项,我们设置一下 Cygwin 里的终端提示符。终端提示符一般通过环境变量 "PS1" 来进行设置,由于这个是 Cygwin(Linux) 特有的环境变量,就不在 Windows 的系统设置里设置这个环境变量了。我们可以新建一个名为 ".bash_profile" 的文件,Cygwin(严格来说是 shell) 启动时会读取这个文件并进行初始化。由于 Windows 下不允许直接以 "." 符号起始的文件,这个文件只能在 Cygwin 中创建,用 vi 命令直接创建并编辑即可(注意是 vi 而不是 vim),写入内容

CC_RESET='[00m'

CC_BLACK='[0;30m'
CC_RED='[0;31m'
CC_GREEN='[0;32m'
CC_BROWN='[0;33m'
CC_BLUE='[0;34m'
CC_PURPLE='[0;35m'
CC_CYAN='[0;36m'

CC_LIGHT_GRAY='[0;37m'
CC_DARK_GRAY='[1;30m'
CC_LIGHT_RED='[1;31m'
CC_LIGHT_GREEN='[1;32m'
CC_YELLOW='[1;33m'
CC_LIGHT_BLUE='[1;34m'
CC_LIGHT_PURPLE='[1;35m'
CC_LIGHT_CYAN='[1;36m'
CC_WHITE='[1;37m'

force_color_prompt=yes
export PS1='\[\e${CC_WHITE}\][\[\e${CC_RESET}\]\
\[\e${CC_LIGHT_BLUE}\]\w\
\[\e${CC_RESET}\]\[\e${CC_WHITE}\]]\[\e${CC_RESET}\]\n\
\[\e${CC_LIGHT_GREEN}\]\u \[\e${CC_RESET}\]\
\[\e${CC_LIGHT_RED}\]\$\[\e${CC_RESET}\] '

效果如下:

cygwin_bash_prompt.png

Python 的安装和使用

安装 Python/Python3

默认情况下,Cygwin 中没有安装 Python ,不过它会读取 Windows 系统中的环境变量,如果自己有单独安装 Python,且已经配置好环境变量,在 Cygwin 中也可以运行 Python 。但建议还是安装 Cygwin 自身软件仓库中的 Python。

首先下载一个 Cygwin 的软件包管理工具: apt-cyg 。这是一个类似 Debian/Ubuntu 中的 apt-get 的工具,可以让我们在 Cygwin 中查找、安装、卸载软件包,非常的方便。依次在 Cygwin 中执行下面两条命令即可安装 apt-cyg:

lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
install apt-cyg /bin

由于 apt-cyg 使用 wget 来访问服务器上的数据,建议先安装一下 wget (不安装的话会用 lynx 替代),同时一些常用的工具也先安装一下

apt-cyg install wget vim gcc-core tmux sl

apt-cyg 的几个子命令:

  • install <package>: 安装软件包
  • remove <package>: 卸载软件包
  • listall <keyword>: 以指定的关键词搜索相关的软件包

apt-cyg 安装好后就可以用来安装 Python 的基本环境了:

apt-cyg install python python3

美中不足的是 Cygwin 中的 Python 3 版本为 3.4.3 ,这对需要使用 Python 3.5 的朋友来说可能是一个比较大的问题。

安装 pip

在安装好 Python 后,通过下面的命令安装 pip 和 pip3:

python -m ensurepip
python3 -m ensurepip

鉴于国内访问 pip 官方的源速度有点慢,可以考虑修改 pip 的配置,使用国内的源,比如:

首先在 Cygwin 的 HOME 目录中新建配置文件:

mkdir ~/.pip/ && touch ~/.pip/pip.conf

然后往里写入以下配置(以使用豆瓣源为例):

[global]
trusted-host=pypi.douban.com
index-url=http://pypi.douban.com/simple/

建议配置好后也更新一下 pip 本身

pip install pip --upgrade

然后就可以直接安装自己想要使用的各种软件包了:

pip install numpy pandas nltk jieba

使用 virtualenv

在实际进行 Python 开发的时候,通常会使用 virtualenv 来进行环境的隔离,什么意思呢?举个例子,我们有两个项目,分别称之为项目 A 和项目 B,它们使用的 Python 版本和 Python 包的版本都不同,如下

项目 A:

  • Python 版本: 2.7
  • Python 包依赖:
    • jieba 0.37
    • nltk 3.1

项目 B:

  • Python 版本: 3.4
  • Python 包依赖:
    • jieba 0.38
    • nltk 3.2

由于系统上的同一个 Python 包是没法安装两个不同版本的,如果使用系统中的 Python 包,是不能满足以上这种情况的。virtualenv 的作用就是为每个单独的项目建立独立的环境。要使用 virtualenv ,在 Cygwin 上只能通过 pip 来安装:

pip install virtualenv

对项目 A ,按如下步骤建立环境:

  • 首先用 virtualenv 为项目 A 建立一个环境:

    virtualenv venv_for_a -p /usr/bin/python2.7
    

    这一步会建立目录 venv_for_a ,并将 python2.7 和 pip 拷贝到其中,形成一个最小的 Python2 运行环境。

  • 用 source 然后激活这个环境:

    source venv_for_a/bin/activate
    
  • 然后安装依赖

    pip install jieba==0.37 nltk==3.1
    

对项目 B 同样如此:

  • 建立环境

    virtualenv venv_for_b -p /usr/bin/python3.4
    
  • 激活环境

    source venv_for_b/bin/activate
    
  • 安装依赖

    pip install jieba==0.38 nltk==3.2
    

Theano/TensorFlow 的安装和使用

本节将在之前搭建好的 Python 开发环境基础上,展示 Windows 下深度学习框架 Theano的安装和使用。

下面的内容都在以下环境下进行:

  1. Cygwin PC x86_64
  2. python2.7
  3. pip 8.1.2
  4. ipythohn 5.1.0
  5. Theano 0.8.2

注: 我也尝试了在 Windows 上安装 TensorFlow ,但是以失败告终,详见后叙。

Theano

theano 的安装比较简单,直接用 pip 进行安装即可:

pip install theano --upgrade

Theano 还依赖 Numpy、Scipy,然后在安装 Scipy 的时候报错,错误信息为:

no lapack/blas resources found

LAPACK/BLAS 是提供线性代数相关计算的 C 库,既然缺失的话,用 apt-cyg 搜索看看:

apt-cyg listall lapack blas

结果为

lapack
lapack-debuginfo
liblapack-devel
liblapack-doc
liblapack0

liblasem0.4-devel
liblasem0.4-doc
liblasem0.4_4
libopenblas
openblas

把 liblapack-devel, libopenblas 和 openblas 装上

apt-cyg install liblapack-devel libopenblas openblas

重试安装,仍然发生错误,相应的错误信息如下:

error: library dfftpack has Fortran sources but no Fortran compiler found

这是因为缺少 fortran 编译器导致的,安装上 gcc-fortran 即可,但仍然报错,说找不到 g++ ,那把 g++ 也装上

apt-cyg install gcc-fortran gcc-g++

安装之后,尝试在 Python 交互环境中执行 import theano 出错,出错信息为

File "theano/gof/cmodule.py", line 2014, in compile_str
  return dlimport(lib_filename)
File "theano/gof/cmodule.py", line 289, in dlimport
    rval = __import__(module_name, {}, {}, [module_name])
ImportError: No module named cutils_ext

在 HOME 中的 .theano 目录下找到了 cutils,我的系统上是: ~/.theano/compiledir_CYGWIN_NT-6.1-2.2.1-0.289-5-3-x86_64-64bit–2.7.10-64/cutils_ext/。按照 这里这里 给出的信息,这个错误的原因在于里面一个名为 cutils_ext.pyd 的文件,它是 Python 生成的编译后的模块,实际上是一个动态链接库(Dynamic Link Library, DLL),见 Python 官方文档 。由于它是一个 DLL,Cygwin 在加载它的时候会希望它的后缀是 dll ,所以出错了,一种暂时的办法是修改一下它的后缀名

cd ~/.theano/compiledir_CYGWIN_NT-6.1-2.2.1-0.289-5-3-x86_64-64bit--2.7.10-64/cutils_ext/
cp cutils_ext.pyd cutils_ext.dll

这样在 import 时是可以成功的,但在执行下面这段代码时依然会出错

import numpy
import theano
import theano.tensor as T
from theano import function


x = T.scalar('x')
y = T.scalar('y')
z = x + y

f = function([x, y], z)
print f(3, 4)

这是因为用 Theano 定义的符号计算过程,最后也要编译成实际的模块,和前面的 cutils_ext.pyd 的问题是一样的,编译生成的模块后缀为 pyd ,但 Cygwin 加载时希望后缀是 dll 。所以要彻底解决这个问题,需要修改 Theano 中生成编译后模块的代码,让其生成的模块后缀为 dll 而不是 pyd。相关的代码在 Theano 代码中的 cmodule.py 中,在我的机器上,其路径为 "/usr/lib/python2.7/site-packages/theano/gof/cmodule.py"。其中有一个名为 get_lib_extension 的函数,其内容为:

def get_lib_extension():
    """
    Return the platform-dependent extension for compiled modules.
    """
    if sys.platform in ['win32', 'cygwin']:
        return 'pyd'
    else:
        return 'so'

将它改为:

def get_lib_extension():
    """
    Return the platform-dependent extension for compiled modules.
    """
    if sys.platform == 'win32':
        return 'pyd'
    elif sys.platform == 'cygwin':
        return 'dll'
    else:
        return 'so'

修改后可以尝试把 ~/.theano 这个目录删除,然后重新在 Python 交互环境中执行 import theano ,成功后会重新生成 ~/.theano/compiledir_CYGWIN_NT-6.1-2.2.1-0.289-5-3-x86_64-64bit–2.7.10-64/cutils_ext/ 这个目录,不出意外的话,里面应该只有一个 cutils_ext.dll 而没有 cutils_ext.pyd 了。

至此便可以在 Cygwin 中正常使用 Theano 了,如下图所示。

cygwin_run_theano.png

TensorFlow

在 TensorFlow 的 Download and Setup 中,介绍了在 Linux 和 Mac OS 平台上安装 TensorFlow 的详细过程,但并没有提供 Windows 的相关内容。不过其中的 Docker installation 一节给出的解决方案是一个在 Windows 上运行 TensorFlow 的折衷办法,但是仅仅为了安装一个 37MB 的 Python 包,而要下载 180 多 MB 的 Docker Toolbox,不太能接受。

目前在 Windows 上运行 TensorFlow 的方案有以下两种:

  1. 在 Windows 上安装 Docker 或者虚拟机,然后在其中安装 TensorFlow,参考: TensorFlow在Windows上的安装
  2. 使用 Windows 10 上的 Bash On Windows 安装 TensorFlow,有 Windows 10 的朋友可以自己尝试下

(这两种方法我也懒得去试验了,有兴趣和条件(我还用着 Windows 7 呢)的朋友自己再去折腾吧~)

事实上 TensorFlow 目前并没有对 Windows 的原生支持,不过对 Windows 平台的支持已经提上议程,见 Roadmap

在 Github 上有一个 Issue,从 2015 年年底至今,一直在讨论 TensorFlow 对 Windows 的原生支持这件事情,希望在 Windows 平台上使用 TensorFlow 的朋友可以关注一下这个 Issue。

其他方案

使用 Anaconda 是另外一个在 Windows 下建立 Python 编程环境的好主意,Anaconda 是一个基于 Python 的「数据科学平台」,内置了许多用于数据科学、机器学习的 Python 包,并有自己的软件包管理工具,也是很推荐的。

Anaconda 在 Windows 上的使用稍微尝试了一下,但没有对其细节做太多了解,所以就不罗嗦了。有需要的话后面再为 Anaconda 单独写一篇吧。