2014-12-13 7 views
14

Ich benutze Python 3.4, und nachdem ich ein Pyvenv erstellt habe, möchte ich es aus einem Python-Prozess heraus aktivieren. Mit virtualenv verwendete ich activate_this.py, aber das scheint in pyvenv verschwunden zu sein.Wie kann ich ein Pyvenv Vitrualenv aus Python heraus aktivieren? (activate_this.py wurde entfernt?)

Gibt es jetzt eine einfache Möglichkeit, den aktuellen Interpreter effektiv in den virtualenv Interpreter zu ändern? Ich könnte wahrscheinlich mit dem PATH umgehen (was activate_this.py tat), aber ich hätte gerne einen einfacheren und stabileren Weg.

Dies ist für die Verwendung in einem wsgi.py.

+0

Ja, die Aktivierung Skript auf Ihrer Plattform abhängig: https://docs.python.org/3/library/venv.html –

+1

Auch das Aktivieren innerhalb eines Python-Prozesses ist nicht vollständig sinnvoll. Sie können nur ein virtualenv aktivieren und anschließend den Python-Interpreter verwenden, der zu diesem virtualenv gehört. –

+0

Ich denke, wenn Sie hier lesen, werden Sie sehen, warum es Sinn macht: http://virtualenv.readthedocs.org/en/latest/virtualenv.html#using-virtualenv-without-bin-python Dies ist die Funktion, die ich Ich suche nach denen scheint in Pyvenv gegangen zu sein. –

Antwort

6

pyvenv und das venv Modul unterstützen dies nicht out of the box. Die dritte Partei virtualenv Paket does support this using activate_this.py, aber that feature was not included in the built-in venv module.

Sie könnten versuchen, eine Kopie von activate_this.py aus einer virtualenv basierten Umgebung zu leihen; es scheint zu funktionieren, obwohl ich nicht schwören kann, dass es perfekt ist (venv/pyvenv verwendet einige Magie während des Starts; unklar, ob alles davon repliziert wird über activate_this.py).

Die virtualenv Dokumente für es sind veraltet für Python 3 (sie behaupten, Sie verwenden execfile, die nicht existiert). Die Python 3 kompatibel Alternative wäre:

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}) 

Nichts activate_this.py magische tut, ist, so könnte man die gleichen Änderungen ohne Plünderungen von virtualenv (Einstellung PATH, sys.path, sys.prefix, etc.), aber Kreditaufnahme macht es viel manuell durchführen einfacher in diesem Fall.

+0

Danke, ich habe es von [hier] geplündert (https://github.com/pypa/virtualenv/blob/master/virtualenv_embedded/activate_this.py) als [pyenv-virtualenv] (https://github.com/pyenv/ Pyenv-Virtualenv) schien nicht zu haben. – cardamom

1

habe ich einen anderen Ansatz in virtualenv selbst verwendet:

# 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())