通过virtualenv创建了基于python3的虚拟环境,激活虚拟环境后发现执行程序时依然在用python2在解析,后折腾一番后发现原因是,虚拟环境中未pip install flask,导致执行程序时系统自动去加载系统默认的python2。折腾的经过如下:
通过如下两行命令分别创建基于python2和python3版本的两个虚拟环境:
virtualenv -p /usr/bin/python ~/virtualenv/one #python2
virtualenv -p /usr/local/python3/bin/python3 ~/virtualenv/two #python3
分别激活两个虚拟环境,查看python版本对应没问题:
[root@localhost one]# source bin/activate
(one) [root@localhost one]# python -V
Python 2.7.5
(one) [root@localhost one]#
[root@localhost two]# source bin/activate
(two) [root@localhost two]# python -V
Python 3.6.4
(two) [root@localhost two]#
用flask框架的入门程序测试:
1
2 from flask import Flask
3
4 app = Flask(__name__)
5
6
7 @app.route('/')
8 def hello_world():
9 return '这是首页'
10
在基于python3的虚拟环境two中启动程序,然后浏览器端访问后报错如下(编码有误,不支持中文):
百度,python2的确默认不支持中文,若要支持中文,需要在代码前加上#coding=utf-8;但python3默认是“utf-8”编码,应该是支持中文的啊。难道解析程序的是python2???,另外网页端报错信息里有python2.7的字样,我更怀疑这是python2。为了证明这是python2而不是python3,通过两个版本对print打印语句的区别:
python2下执行print ('hhh','ggg')结果应该为:('hhh','ggg')
python3下执行print ('hhh','ggg')结果应该为: hhh ggg
验证,基于python3的虚拟环境two下输出依然为:('hhh','ggg'),这就证明这的确是python2
那么问题来了,为什么开始明明在基于python3的虚拟环境two中查看python版本时的确显示的是python3.6.4,但解析程序时会是python2呢??????????????????????????
后想了下会不会和flask有关,突然想到two虚拟环境下我好像没pip install flask,查看pip list如下:
(two) [root@localhost two]# pip list
Package Version
------------ -------
click 6.7
itsdangerous 0.24
MarkupSafe 1.0
pip 18.0
setuptools 40.2.0
Werkzeug 0.14.1
wheel 0.31.1
(two) [root@localhost two]#
加载flask后重新启动程序不再报错:
(two) [root@localhost app]# pip list
Package Version
------------ -------
click 6.7
Flask 1.0.2
itsdangerous 0.24
Jinja2 2.10
MarkupSafe 1.0
pip 18.0
setuptools 40.2.0
Werkzeug 0.14.1
wheel 0.31.1
(two) [root@localhost app]# ./start
* Environment: development
* Debug mode: on
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 155-900-164
网页端中文显示正常: