salir entorno crear activar python-3.x mod-wsgi

python-3.x - entorno - virtualenv debian



¿Cómo puedo activar un pyvenv vitrualenv desde python?(activate_this.py fue eliminado?) (2)

Estoy usando Python 3.4, y habiendo creado un pyvenv, estoy buscando activarlo desde dentro de un proceso de python. Con virtualenv, solía usar activate_this.py , pero parece que se ha ido en pyvenv.

¿Existe ahora una manera fácil de cambiar efectivamente el intérprete actual al intérprete virtualenv? Probablemente podría meterme con el PATH (que es lo que activate_this.py hizo), pero me gustaría una forma más simple y más estable.

Esto es para usar en wsgi.py.


pyvenv y venv no son compatibles con esto de venv . El paquete de terceros virtualenv admite esto utilizando activate_this.py , pero esa característica no se incluyó en el módulo de venv .

Podría intentar tomar prestada una copia de activate_this.py de un entorno basado virtualenv ; parece funcionar, aunque no puedo jurar que sea perfecto ( venv / pyvenv usa algo de magia durante el inicio, no está claro si todo se replica a través de activate_this.py ).

Los documentos virtualenv están desfasados ​​para Python 3 (afirman que usas execfile , que no existe). La alternativa compatible con Python 3 sería:

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

Nada de lo que activate_this.py hace es mágico, por lo que puedes realizar los mismos cambios manualmente sin sys.path de virtualenv (ajustando PATH , sys.path , sys.prefix , etc.), pero pedir prestado lo hace mucho más simple en este caso.


Utilicé un enfoque diferente utilizado en virtualenv mismo:

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