virtualenv使用记录
前几天打算给公众号搭个小脚本,所以用了virtualev+pycharm搭建了一个虚拟环境,踩的坑如下:
一、问题描述
在virtualenv环境,python manage.py migrate出现Django无法导入
环境: win7 64位
py版本:python3.6
软件: pycharm 2017.1.5
虚拟环境是由pycharm所创建(Creat VirtualEnv)
cmd 激活虚拟环境 E:\space_env\env_by_pycharm\Scripts>activate.bat
然后pycharm内打开一个基于django 1.11.8和python3.6的工程
安装好依赖包,配置好基本环境,点启动按钮可以运行。并且login.html页可访问
但是所有需要调用数据库的操作都会报错
在Terminal输入python manage.py makemigrations / python manage.py migrate
得到如下错误:
(env_by_pycharm) F:\Django\c_s_t_mannager>python manage.py
Traceback (most recent call last):
File "manage.py", line 18, in <module>
"Couldn't import Django. Are you sure it's installed and "
ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
二、解决过程
查了N多资料,没一个说到点上。
最后我在Terminal输入python发现压根没执行虚拟环境的python3.6
执行的是系统默认的python2.7,然后发现问题所在
因为我电脑上装了两个版本的python:
python-->>python2.7
python3-->>python3.6
于是我执行了python3 manage.py migrate
数据库同步成功!
三、结论
说到根上还是因为,virtualenv的虚拟化是基于系统已装环境。
在基于python3.6刚创建的env环境里,输入python
(env_by_pycharm) E:\space_env\env_by_pycharm\Scripts>python
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bi
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
发现运行的还是python2.7
另外,pycharm默认的Terminal其实就是Windows系统的cmd
最终启动数据库,走的还是系统的python3命令
四、延伸
Virtualenv的虚拟化,仅仅是另外找个文件夹创建了一堆py文件吗
说好的隔离呢???
结合其他几种常见的虚拟化手段,我们大概能发现一些端倪:
- virtualenv 做到包隔离;
- pyenv 能做 python 版本隔离;
- docker 则可以做到系统级的隔离,隔离性更好;
对于virtualenv, 只是用来隔离不同工程所需的不同的依赖
pillow 、 python-lxml 、 psycopg2 等一票 c/c++依赖表示 virtualenv 只能说是很一般的隔离...
另外还有一个坑就是:
virtualenvwrapper是用来管理virtualenv的,方便查看每个虚拟环境的具体情况
但是这货,只能识别和管理它自己建立的,其他虚拟环境不认。