努力, 努力, 再努力
全部博文(220)
分类: Python/Ruby
2016-04-28 18:50:42
因工作需要,为现有的OpenVPN服务器写一个管理页面
主要功能:
管理员登录可以添加VPN用户,修改VPN用户密码
普通用户登录只能修改自已的VPN登录密码和WEB页面的登录密码
开发环境: python 2.7.10 + flask-0.10.1+ mysql 5.1.73
开发工具: PyCharm 5.0.4
将代码部署到线上环境,系统自带的python2.6.6 无法正常运行。
因python2.6.6 升级到2.7.10 坑比较多,防止日后遗忘,特此写个备忘。
1. centos6.5 : 自带python2.6.6 , yum程序依赖python2.6.6
2. python2.7.10: 在windows上写的flask程序是基于python2.7.10的
解释器,因此必须把线上环境升级到python2.7.10
3. virtualenv是虚拟python环境
virtualenv是一个Python环境配置和切换的工具,可以用它配置多个
Python运行环境,和系统中的Python环境隔离,即所谓的沙盒。
沙盒的好处包括:
(1)解决库之间的版本依赖,比如同一系统上不同应用依赖同一个库的不同版本。
(2)解决权限限制,比如你没有 root 权限。
(3)尝试新的工具,而不用担心污染系统环境。
使用virtualenv 的目标,即要保留系统自带的python2.6.6, 又要使用新安装的python2.7.10
4. pip: pip也是一个包管理工具,它和setuptools类似,如果使用virtualenv,会自动安装一个pip
使用pip 可以很方便的安装flask程序所依赖的多个扩展包
5. setuptools
setuptools管理Python的第三方包,将包安装到site-package下,安装的包后缀一般为.egg,实际为ZIP格式。默认从 下载包,能够解决Python包的依赖关系。
是目前 python 包管理的事实标准,2008年发布。它被用作 easy_install 的替代品,但是它仍有大量的功能建立在 setuptools 组件之上。
由于pip还有大量功能建立在setuptools 组件之上,因此,安装pip还必须要安装setuptools
6. wheel
本质上是一个 zip 包格式,它使用 .whl 扩展名,用于 python 模块的安装,它的出现是为了替代 Eggs。
1. 系统版本:centos6.5 (mini Desktop类型安装)
2. 内核版本: 2.6.32-431.el6.x86_64
3. 原python版本: Python 2.6.6
4. 新python版本: python 2.7.10
5. virtualenv 版本:15.0.1 (最新2016-3-17)
6. pip版本: 8.1 (由virtualenv 15.0.1 自动安装)
7. setuptools: 20.3 (由virtualenv 15.0.1 自动安装)
7. wheel版本:wheel 0.29.0 (由virtualenv 15.0.1 自动安装)
这点很重要,其实python的安装过程还是比较智能的。
只要zlib-devel, openssl-devel这些包都用YUM安装上,python安装过程会自动找到这些包的头文件。
但如果不提前将安装依赖包,将会遇到很多的坑
yum install epel-release -y
yum install gcc gcc-c++ autoconf automake zlib-devel openssl-devel readline-devel sqlite-devel sqlite2-devel-y
Python 2.7.10
wget
官网:
tar -zxvf Python-2.7.10.tgz
cd Python-2.7.10
./configure --prefix=/usr/local/python2.7
make && make install
vim /etc/profile
最后一行添加: export PATH=/usr/local/python2.7/bin:$PATH
导入环境变量:source /etc/profile
[root@vpntest ~]# python
Python 2.7.10 (default, Apr 20 2016, 21:31:00)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
说明:
安装virutalenv 主要目的是不希望新的python2.7.10影响系统原有的python
因为,yum还再使用python2.6.6
wget --no-check-certificate
官网链接:
另外还可以从
---->PyPI菜单 进入
再搜索virtualenv关键字
%3Aaction=search&term=virtualenv&submit=search
tar -zxvf virtualenv-15.0.1.tar.gz
cd virtualenv-15.0.1
[root@vpntest virtualenv-15.0.1]# python setup.py install
running install
running build
running build_py
running build_scripts
creating build/scripts-2.7
copying and adjusting scripts/virtualenv -> build/scripts-2.7
changing mode of build/scripts-2.7/virtualenv from 644 to 755
running install_lib
copying build/lib/virtualenv.py -> /usr/local/python2.7/lib/python2.7/site-packages
creating /usr/local/python2.7/lib/python2.7/site-packages/virtualenv_support
copying build/lib/virtualenv_support/wheel-0.29.0-py2.py3-none-any.whl -> /usr/local/python2.7/lib/python2.7/site-packages/virtualenv_support
copying build/lib/virtualenv_support/pip-8.1.1-py2.py3-none-any.whl -> /usr/local/python2.7/lib/python2.7/site-packages/virtualenv_support
copying build/lib/virtualenv_support/argparse-1.4.0-py2.py3-none-any.whl -> /usr/local/python2.7/lib/python2.7/site-packages/virtualenv_support
copying build/lib/virtualenv_support/__init__.py -> /usr/local/python2.7/lib/python2.7/site-packages/virtualenv_support
copying build/lib/virtualenv_support/setuptools-20.3-py2.py3-none-any.whl -> /usr/local/python2.7/lib/python2.7/site-packages/virtualenv_support
byte-compiling /usr/local/python2.7/lib/python2.7/site-packages/virtualenv.py to virtualenv.pyc
byte-compiling /usr/local/python2.7/lib/python2.7/site-packages/virtualenv_support/__init__.py to __init__.pyc
running install_scripts
copying build/scripts-2.7/virtualenv -> /usr/local/python2.7/bin
changing mode of /usr/local/python2.7/bin/virtualenv to 755
running install_egg_info
Writing /usr/local/python2.7/lib/python2.7/site-packages/virtualenv-15.0.1-py2.7.egg-info
[root@vpntest ~]# virtualenv --version
15.0.1
创建python2.7虚拟环境:自动安装setuptools, pip, wheel.
[root@vpntest ~]# virtualenv venv27 (venv27是虚拟环境的名子,随便起)
New python executable in /root/venv27/bin/python
Installing setuptools, pip, wheel...done.
(1) 安装flask扩展集合的依赖包,mysql mysql-server,mysql-devel
yum install mysql mysql-server mysql-devel
(2) 上传flask扩展需求文件:
[root@vpntest ~]# cat requirement.txt
(requirement.txt包含了开发环境安装的flask扩展包)
alembic==0.6.2
blinker==1.3
chardet==2.3.0
docutils==0.12
dominate==2.1.17
Flask==0.10.1
Flask-Bootstrap==3.0.3.1
Flask-Login==0.3.1
Flask-Mail==0.9.0
Flask-Migrate==1.1.0
Flask-Moment==0.2.1
Flask-MySQLdb==0.2.0
Flask-Script==0.6.6
Flask-SQLAlchemy==1.0
Flask-WTF==0.9.4
funcsigs==1.0.0
itsdangerous==0.23
Jinja2==2.7.1
lamson==1.3.4
lockfile==0.12.2
Mako==0.9.1
MarkupSafe==0.18
mock==2.0.0
mysqlclient==1.3.7
nose==1.3.7
ordereddict==1.1
pbr==1.9.1
python-daemon==2.1.1
python-editor==1.0
python-modargs==1.7
six==1.10.0
SQLAlchemy==0.9.9
visitor==0.1.2
Werkzeug==0.10.4
wheel==0.29.0
WTForms==1.0.5
如果requirement.txt里的包版本低于现有环境的包版本,
pip将卸载较新的版本,安装requirement.txt里指定的版本
(3) 安装flask扩展包
source venv27/bin/activate 进入沙盒,注意venv27在当前目录
pip install -r requirement.txt
安装截图:
在此之后,就可以设置mysql数据,创建库表,迁移数据库,上传代码,做初步代码功能测试了
源码编译时遇到的非停滞,非ERROR级别的错误提示不能忽略,即使英文不好也要看明白,否则这将是个大坑
python 各个组件包之间的相互关系没搞清楚,setuptools, 与pip, wheel之间是怎么回事都不明白。这导致整个安装过程只能按百度的文档按部就班的操作,有时根本不清楚某些步骤是什么目标。不知道自己在做什么。
之前源码安装遇到configure报错,过程会停止不前,直到“ERROR级别”的报错全部排除,configure过程才能顺利通过,偶尔会遇到warning级警告,但configure过程会通过,make, make install过程也会通过,此时,软件的安装过程基本就算正常完成了。
但这次安装python 2.7.10 却大不相同. Python 2.7.10 在configure过程时通过,但报告如下:
Python build finished, but the necessary bits to build these modules
were not found:
_curses _curses_panel _sqlite3
_ssl _tkinter bsddb185
bz2 dl imageop
readline sunaudiodev zlib
To find the necessary bits, look in setup.py in detect_modules() for
the module's name.
这个报错未理会,由此挖了个大坑,坑了自己
这里提示zlib, _ssl未安装,pthon2.7.10编译安装过程完成,但在安装setuptools时,报告zlib未安装,此时,误以为setuptools需要zlib, zlib-devel, 于是YUM安装,但很显然是无效的。直接跳过setuptools,安装pip,又提示需要setuptools
直接安装virtualenv
14.0.2 一路报错。
后又重新编译安装python2.7.10, 这时不在提示zlib了,又提示缺少ssl模块,同样,setuptools无法安装,pip无法安装。
再后来翻看了隋总的日记,需要YUM安装zlib-devel, openssl-devel等包,恍悟。原来根本原因没有安装依赖的开发包。(头天看了隋总的日志,但没到这篇)
安装了依赖包,zlib-devel, openssl-devel, readline-devel sqlite-devel sqlite2-devel-y
再安装python2.7.10就非常顺利了,然后是安装virtualenv
15.0.1(最新版本2016-3-17)
Virtualenv 在创建虚拟环境时自动安装pip,
setuptools, wheel
此时,再执行pip install –r requirement.txt, 非常顺利。至此结束。
八.总结—惯性思维是个陷阱
1. 熟悉英文很重要
2. 搞清楚流程中各个步骤的目的,相互关系很重要。
3. linux 之下无论是否是源码安装,YUM, 源码,python,都会存在包与包之间的依赖关系。绝不能忽略
4. 大致排障过程