1
1
""" Support virtualenv in pymode. """
2
2
3
- import os .path
3
+ import os
4
+ import sys
5
+ import site
4
6
5
7
from .environment import env
6
8
@@ -25,13 +27,44 @@ def enable_virtualenv():
25
27
activate_this = os .path .join (
26
28
os .path .join (path , 'Scripts' ), 'activate_this.py' )
27
29
28
- f = open (activate_this )
29
30
try :
30
- source = f .read ()
31
- exec (compile ( # noqa
32
- source , activate_this , 'exec' ), dict (__file__ = activate_this ))
33
- env .message ('Activate virtualenv: ' + path )
34
- env .let ('g:pymode_virtualenv_enabled' , path )
35
- return True
36
- finally :
37
- f .close ()
31
+ with open (activate_this ) as f :
32
+ source = f .read ()
33
+ exec (compile ( # noqa
34
+ source , activate_this , 'exec' ), dict (__file__ = activate_this ))
35
+ except IOError :
36
+ _activate_env_from_path (path )
37
+
38
+ env .message ('Activate virtualenv: ' + path )
39
+ env .let ('g:pymode_virtualenv_enabled' , path )
40
+ return True
41
+
42
+
43
+ def _activate_env_from_path (env_path ):
44
+ """ Fix when `activate_this.py` does not exist.
45
+
46
+ For Python 3.3 and newer, a new command-line tool `pyvenv` create venv
47
+ will not provide 'activate_this.py'.
48
+ """
49
+ prev_sys_path = list (sys .path )
50
+
51
+ if sys .platform == 'win32' :
52
+ site_packages_paths = [os .path .join (env_path , 'Lib' , 'site-packages' )]
53
+ else :
54
+ lib_path = os .path .join (env_path , 'lib' )
55
+ site_packages_paths = [os .path .join (lib_path , lib , 'site-packages' )
56
+ for lib in os .listdir (lib_path )]
57
+ for site_packages_path in site_packages_paths :
58
+ site .addsitedir (site_packages_path )
59
+
60
+ sys .real_prefix = sys .prefix
61
+ sys .prefix = env_path
62
+ sys .exec_prefix = env_path
63
+
64
+ # Move the added items to the front of the path:
65
+ new_sys_path = []
66
+ for item in list (sys .path ):
67
+ if item not in prev_sys_path :
68
+ new_sys_path .append (item )
69
+ sys .path .remove (item )
70
+ sys .path [:0 ] = new_sys_path
0 commit comments