Llamando a IPython desde un virtualenv

Entiendo que IPython no es compatible con virtualenv y que la solución más lógica para esto es instalar ipython en cada virtualenv por separado usando

pip install ipython 

Hasta ahora tan bueno. Una cosa que noté es que si se $> ipython copia de IPython de todo el sistema desde un virtualenv usando $> ipython antes de instalar IPython bajo este virtualenv, los siguientes comandos de $> ipython continuarán para mostrar la copia de ipython de todo el sistema.

Por otro lado, si no se llama a ipython antes de instalarlo bajo 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 algún problema en el camino.

alias ipy="python -c 'import IPython; IPython.terminal.ipapp.launch_new_instance()'"

Esta es una excelente manera de estar siempre seguro de que la instancia de ipython siempre pertenece a la versión de python de virtualenv.

Esto funciona solo en ipython> 2.0.

Fuente

Puede forzar a IPython a usar un entorno virtual si está disponible agregando el archivo a continuación a ~/.ipython/profile_default/startups :

 import os import sys if 'VIRTUAL_ENV' in os.environ: py_version = sys.version_info[:2] # formatted as XY 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 esto funcione.

¡La respuesta dada por @SiddharthaRT es buena! Siguiendo este enfoque, es más simple para mí solo:

 python -m IPython 

Esto utilizará el módulo IPython a través de la bandeja de python, asegurando que se refiera a la bandeja desde el env virtual.

Como han mencionado otros, las versiones recientes de ipython son compatibles con virtualv, por lo que puede usar su script virtualenv bin activar para ejecutar ipython usando su virtualenv, por ejemplo

 $ source venv/bin/activate (venv) $ ipython WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv. 

Si está intentando abrir un cuaderno, incluso ipython 5 no ayudará, ipython ignorará el virtualenv (al menos en mi máquina / configuración). Deberá usar el script de rgtk, pero asegúrese de modificar la parte de filtro opcional y el sys.path.insert como se muestra a continuación:

 import os import sys if 'VIRTUAL_ENV' in os.environ: py_version = sys.version_info[:2] # formatted as XY 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, podríamos romper sys.path e insertar a continuación fallaría
  • ADD2: vea esta pregunta y la documentación de python

(Debian / Ubuntu) asumiendo 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.