Ejecutar el script de Python desde dentro de virtualenv bin no funciona

Tengo un script que quiero estar disponible globalmente. Lo he empezado con el hashbang estándar:

#! /usr/bin/env python 

Y lo vinculé al directorio bin de mi virtualenv:

 ~/environments/project/env/bin/myscript 

Y agregó ese directorio a mi ruta. Cuando ejecuto el comando:

 myscript 

Recibo un error de importación con una de las bibliotecas. Sin embargo, si activo el entorno virtual y ejecuto el script, funciona como se esperaba.

Descarté un problema con el enlace simbólico (también intenté simplemente mover el script dentro de la carpeta bin). También he intentado ejecutar el script con python

 python ~/environments/project/env/bin/myscript 

Anteriormente estaba usando un script que activaba el entorno y luego ejecutaba mi script, pero tenía la impresión de que el script ejecutado desde esta carpeta debería ejecutarse con el interpretador y los paquetes de sitio de virtualenv. ¿Alguna idea de por qué esto podría no funcionar o de alguna manera podría depurar esto?

Poner el script en la bandeja de su virtualenv, y luego agregar esa ubicación de la bandeja a su PATH global no generará automáticamente su virtualenv. Es necesario que primero lo obtengas para activarlo.

Todo lo que su sistema sabe es verificar esa ruta adicional para el ejecutable y ejecutarlo. No hay nada en ese script que indique un virtualenv.

Sin embargo, podría codificar la línea de she-bang a su python virtualenv, en cuyo caso los paquetes de sitio terminarán en la ruta:

 #!/Users/foo/environments/project/env/bin/python 

O otra opción es simplemente crear una pequeña envoltura de bash que llame a su script de pythons original, lo que le permitirá dejar su script original con un she-bang genérico.

Entonces, si myscript.py es: #!/usr/bin/env python

Entonces puedes hacer un myscript :

 #!/bin/bash /Users/foo/environments/project/env/bin/python myscript.py 

Cuando haga myscript , llamará explícitamente a su script de Python con el intérprete que configuró.

Creo que estás confundido en cuanto a cómo funciona virtualenv.

En pocas palabras, virtualenv modifica el entorno de su shell para que Python busque en diferentes áreas para encontrar los módulos que desea importar. Realmente no existe ninguna relación entre el lugar donde almacena su entorno virtual y el lugar donde almacena los archivos de origen que ejecuta en virtualenv. Si lo desea, puede almacenar su virtualenv en un directorio llamado ~ / environment / my_env, y toda la fuente que codifique mientras usa su virtualenv en ~ / projects / my_proj.

Puede leer más sobre lo que hace virtulenv en los documentos.

En realidad, lo único que le dice a Python dónde encontrar los módulos está completamente basado en Python ( consulte la documentación sobre cómo funciona). La activación de un virtualenv cambia la forma en que funciona Python.

Puede volver a hacer que un script de shell active el virtualenv por usted, o puede seguir esta receta para activarlo directamente desde su script.

 activate_this = '/path/to/env/bin/activate_this.py' execfile(activate_this, dict(__file__=activate_this)) 

Si elige esta ruta, tenga en cuenta la información que los documentos proporcionan:

Esto cambiará sys.path e incluso cambiará sys.prefix, pero también le permitirá utilizar un intérprete existente. Los elementos de su entorno se mostrarán primero en sys.path, antes de los elementos globales. Sin embargo, los elementos globales siempre serán accesibles (como si la bandera –system-site-packages se hubiera utilizado para crear el entorno, ya sea que se haya utilizado o no). Además, esto no puede deshacer la activación de otros entornos o módulos que se han importado. No debe intentar, por ejemplo, activar un entorno antes de una solicitud web; debe activar un entorno lo antes posible y no volver a hacerlo en ese proceso.

¿No podrías simplemente agregar una ruta relativa? Esto funcionó para mí:

 #!./env/bin/python 

Me enfrenté al mismo problema y se me ocurrió esta solución: https://github.com/jabbalaci/wpython . Es un script llamado ” wpython ” que llama a su progtwig con el intérprete Python local en su venv. Por lo tanto, en lugar de ” /Users/foo/environments/project/env/bin/python myscript.py ” es suficiente escribir ” wpython /path/to/myscript.py “. Un script de inicio podría tener este aspecto:

 #!/usr/bin/env bash cd /the/directory/where/myscript.py/is/located wpython myscript.py 

En caso de que esté utilizando Windows, puede incluir la siguiente línea en la parte superior del archivo de python.

 #! P:\Workspace\pythontut\Scripts python