notebook - Llamar a IPython desde un virtualenv
kernel python2 jupyter (5)
(Debian / Ubuntu) suponiendo que alguna versión (x) de Python3 está instalada, entonces:
$ sudo apt-get install -y ipython
$ virtualenv --python=python3.x .venv
$ source .venv/bin/activate
$ pip3 install ipython
$ ipython3
lanzará ipython ejecutando su versión de Python3.
Entiendo que IPython no es virtualenv-aware y que la solución más lógica para esto es instalar ipython en cada virtualenv por separado usando
pip install ipython
Hasta aquí todo bien. Una cosa que noté es que si la copia de IPython de todo el sistema se llama desde un virtualenv usando $> ipython
antes de que se instale IPython bajo este virtualenv, los comandos subsiguientes $> ipython
continuarán mostrando la copia ipython de todo el sistema.
Por otro lado, si no se llama a ipython antes de instalarlo bajo un virtualenv $> ipython
aparecerá la copia recién instalada.
¿Cuál es la explicación para esto?
También me hace preguntarme si este comportamiento significa que debería esperar algunos problemas en el camino.
Como otros mencionaron, las versiones recientes de ipython son virtualenv conscientes, por lo que puede usar su script virtualenv bin activate para ejecutar ipython usando su virtualenv, por ej.
$ source venv/bin/activate
(venv) $ ipython
WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv.
Puede obligar a IPython a utilizar un entorno virtual, si está disponible, agregando el siguiente archivo a ~/.ipython/profile_default/startups
:
import os
import sys
if ''VIRTUAL_ENV'' in os.environ:
py_version = sys.version_info[:2] # formatted as X.Y
py_infix = os.path.join(''lib'', (''python%d.%d'' % py_version))
virtual_site = os.path.join(os.environ.get(''VIRTUAL_ENV''), py_infix, ''site-packages'')
dist_site = os.path.join(''/usr'', py_infix, ''dist-packages'')
# OPTIONAL: exclude debian-based system distributions sites
sys.path = filter(lambda p: not p.startswith(dist_site), sys.path)
# add virtualenv site
sys.path.insert(0, virtual_site)
Recomiendo nombrarlo 00-virtualenv.py
para que los cambios se realicen lo antes posible.
Nota: asegúrese de que ipython esté instalado en el nuevo entorno virtual para que funcione.
Si está intentando abrir un bloc de notas, incluso ipython 5 no lo ayudará: ipython ignorará el virtualenv (al menos en mi máquina / configuración). Tendrá que utilizar la secuencia de comandos de rgtk, pero asegúrese de modificar la parte de filtro opcional y sys.path.insert como a continuación:
import os
import sys
if ''VIRTUAL_ENV'' in os.environ:
py_version = sys.version_info[:2] # formatted as X.Y
py_infix = os.path.join(''lib'', (''python%d.%d'' % py_version))
virtual_site = os.path.join(os.environ.get(''VIRTUAL_ENV''), py_infix, ''site-packages'')
dist_site = os.path.join(''/usr'', py_infix, ''dist-packages'')
# OPTIONAL: exclude debian-based system distributions sites
# ADD1: sys.path must be a list
sys.path = list(filter(lambda p: not p.startswith(dist_site), sys.path))
# add virtualenv site
# ADD2: insert(0 is wrong and breaks conformance of sys.path
sys.path.insert(1, virtual_site)
- ADD1: en el script original recuperamos un objeto de filtro, romperíamos sys.path e insertaremos a continuación fallaría
- ADD2: mira esta pregunta y la documentación de python
alias ipy="python -c ''import IPython; IPython.terminal.ipapp.launch_new_instance()''"
Esta es una gran manera de estar siempre seguros de que la instancia de ipython siempre pertenece a la versión python de virtualenv.
Esto funciona solo en ipython> 2.0.