Windows 上 Python 开发环境搭建
2016-09-10目录
前言
本文会涉及:
- Windows 上 Python 开发环境的建立(基于 Cygwin)
- Python 开发的一些基础知识
- 深度学习框架 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 的安装目录,同时在安装完成后,Cygwin 会将这个目录当作根目录(Linux 上的 /)。
安装过程中会从网络上下载各种东西,这里可以设置用于存放这些东西的 临时目录 :
到下面这一步需要选择下载站点,大致上来说选国内的站点速度会快一些,教育网的建议选中科大的源(http://mirrors.ustc.cn/),如图;非教育网的话可以在下面那个「User URL」输入框中填入网易的源(http://mirrors.163.com/cygwin/),点击 Add 后网易的源就会出现在列表中,选中即可。
然后会进入一个更详细的安装页面,一些基础的、必须的软件包已经默认选中了,可以按自己的需要选择一些额外的软件包。
点下一步继续,会开始下载、安装选中的软件包,如无意外,就可以顺利安装上 Cygwin 了。
至此安装结束,会在桌面上生成 Cygwin 的快捷方式,双击即可打开,正常的话,应该会看到下面这样一个黑乎乎的窗口,其实就是个终端啦。
Cygwin 的界面设置
刚安装好时的 Cygwin 默认外观并不是很好看(当然比 cmd 还是好看一点的……),我们可以通过调整设置来获得一个更让人舒适的外观。
首先是字体,在 Cygwin 的窗口区域右键,选择 Options 会弹出 Cygwin 的设置,如下所示进行字体设置:
这里我选择了 DejaVu Sans Mono 这一款字体,这是我常用的编程字体 —— 以我的标准而言,一款编程用的字体,最低要求是要能区分出一些形状相似的字符,如下图所示:
注: 这个字体并不是 Windows 自带的,需要自己下载和安装。
然后,如下图所示,在 Looks 一栏可以设置窗口的透明度
这是选择透明等级 Med (中等)后的效果
可以看到右边还有一个 "Glass" 可以选,选择后的效果为
注意,这里我为了配合透明和 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}\] '
效果如下:
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 的配置,使用国内的源,比如:
- V2EX: http://pypi.v2ex.com/simple/
- 豆瓣: http://pypi.douban.com/simple/
- 阿里云: http://mirrors.aliyun.com/pypi/simple/
- 中科大: https://pypi.mirrors.ustc.edu.cn/simple
首先在 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的安装和使用。
下面的内容都在以下环境下进行:
- Cygwin PC x86_64
- python2.7
- pip 8.1.2
- ipythohn 5.1.0
- 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 了,如下图所示。
TensorFlow
在 TensorFlow 的 Download and Setup 中,介绍了在 Linux 和 Mac OS 平台上安装 TensorFlow 的详细过程,但并没有提供 Windows 的相关内容。不过其中的 Docker installation 一节给出的解决方案是一个在 Windows 上运行 TensorFlow 的折衷办法,但是仅仅为了安装一个 37MB 的 Python 包,而要下载 180 多 MB 的 Docker Toolbox,不太能接受。
目前在 Windows 上运行 TensorFlow 的方案有以下两种:
- 在 Windows 上安装 Docker 或者虚拟机,然后在其中安装 TensorFlow,参考: TensorFlow在Windows上的安装
- 使用 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 单独写一篇吧。