相关文章推荐
礼貌的机器人  ·  dpdk Segmentation ...·  1 年前    · 
腼腆的香菇  ·  Free SQL Database ...·  1 年前    · 

通过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框架的入门程序测试:

2 from flask import Flask 4 app = Flask(__name__) 7 @app.route('/') 8 def hello_world(): 9 return '这是首页'

在基于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

网页端中文显示正常:

总结:使用virtualenv创建虚拟环境时,如果虚拟环境中未加载flask,那么即使你的虚拟环境是基于python3的,但执行flask框架程序时,系统会自行加载python2来解析程序!!!

通过virtualenv创建了基于python3的虚拟环境,激活虚拟环境后发现执行程序时依然在用python2在解析,后折腾一番后发现原因是,虚拟环境中未pip install flask,导致执行程序时系统自动去加载系统默认的python2。折腾的经过如下:通过如下两行命令分别创建基于python2和python3版本的两个虚拟环境:virtualenv -p /usr/bin/pyt...
可以使用 virtualenv 的-- python 选项来指定要使用的 Python 版本 。例如,要创建一个名为myenv的 虚拟环境 ,并使用 Python 3.6,请运行以下命令: virtualenv -- python = python 3.6 myenv 这将创建一个名为myenv的 虚拟环境 ,并使用 Python 3.6作为默认 Python 版本 。您可以使用以下命令激活 虚拟环境 : source myenv/bin/activate 然后,您可以在 虚拟环境 安装所需的 Python 包,而不会影响系统 Python 或其他 虚拟环境