2014-12-13 17 views
14

Używam Pythona 3.4, a po utworzeniu pyvenv, chcę go aktywować z procesu Pythona. Używając virtualenv, używałem activate_this.py, ale wydaje się, że zniknęło w pyvenv.Jak mogę aktywować pyvenv vitrualenv z poziomu Pythona? (activate_this.py został usunięty?)

Czy istnieje teraz prosty sposób na skuteczną zmianę obecnego tłumacza na interpreter virtualenv? Mógłbym prawdopodobnie zadziwić się z PATH (co zrobiłem activate_this.py), ale chciałbym prostszy i stabilniejszy sposób.

Jest do użytku w pliku wsgi.py.

+0

Tak, skrypt aktywacja zależy od platformy: https://docs.python.org/3/library/venv.html –

+1

także aktywacja w procesie Pythona nie ma całkowicie sensu. Możesz aktywować virtualenv, a następnie użyć interpretera Pythona należącego do tego virtualenv. –

+0

Myślę, że jeśli przeczytasz tutaj, zobaczysz, dlaczego ma to sens: http://virtualenv.readthedocs.org/en/latest/virtualenv.html#using-virtualenv-without-bin-python To jest funkcja I szukam tego, co wydaje się być nieobecne w pyvenv. –

Odpowiedz

6

pyvenv i moduł venv nie obsługują tego po wyjęciu z pudełka. Trzecia strona zawiera pakiet virtualenvdoes support this using activate_this.py, ale that feature was not included in the built-in venv module.

Możesz spróbować pożyczyć kopię activate_this.py ze środowiska opartego na virtualenv; Wydaje się, że działa, ale nie mogę przysiąc, że to będzie idealne (venv/pyvenv używa jakiejś magii podczas uruchamiania, niejasne, czy wszystko to jest replikowane przez activate_this.py).

Dokumenty dla tego są nieaktualne dla Python 3 (twierdzą, że używasz execfile, która nie istnieje). Python 3 kompatybilny alternatywą byłoby:

activator = 'some/path/to/activate_this.py' # Looted from virtualenv; should not require modification, since it's defined relatively 
with open(activator) as f: 
    exec(f.read(), {'__file__': activator}) 

Nic activate_this.py nie jest magiczne, więc można ręcznie wykonać te same zmiany bez plądrowania virtualenv (dostosowanie PATH, sys.path, sys.prefix, itp), ale sprawia, że ​​wiele pożyczek prostsze w tym przypadku.

+0

Dzięki, splądrowałem go z [tutaj] (https://github.com/pypa/virtualenv/blob/master/virtualenv_embedded/activate_this.py) jako [pyenv-virtualenv] (https://github.com/pyenv/ pyenv-virtualenv) najwyraźniej go nie ma. – cardamom

1

użyłem innego podejścia stosowanego w virtualenv się:

# the current Python interpreter is not from the virtual environment 
file = __file__ 
if file.endswith('.pyc'): 
    file = file[:-1] 
venv_executable = PROJECT_DIR/'venv'/'bin'/'python' 
popen = subprocess.Popen([venv_executable, file] + sys.argv[1:]) 
raise SystemExit(popen.wait())