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的,方便查看每个虚拟环境的具体情况
但是这货,只能识别和管理它自己建立的,其他虚拟环境不认。


参考:V2EX关于虚拟环境的讨论

posted on 2017-11-26 11:59  robgo  阅读(653)  评论(0编辑  收藏  举报