Estoy tratando de hacer un entorno de Python separado del sistema (usando virtualenv) en un directorio que no está en / home, porque necesito usarlo para construir otro software que tenga que ser accesible para múltiples usuarios. Puedo crear y activar virtualenv bien, pero cuando hago sudo
algún comando (por ejemplo, para hacer o compilar otro software), es el sistema python el que se usa (puedo decirlo debido a los módulos disponibles).
Dado que en Ubuntu no es bueno usar el usuario root , ¿hay alguna manera de decir sudo
que use un virtualenv? ¿O tal vez este no es el enfoque correcto, y debería hacer una instalación de Python completamente nueva?
Estoy usando la versión de 64 bits de Ubuntu 12.04 (y Python 2.7).
Respuestas:
El problema es casi seguro que cuando ejecuta
sudo
, las variables de entorno virtualenv, los alias, las funciones, etc. no se transfieren.La solución sería ejecutar explícitamente el ejecutable Python del entorno virtual con
sudo
. Por ejemplo, si su virtualenv es ./AwesomeProject, entonces podría ejecutarsudo ./AwesomeProject/bin/python <script>
el script con virtualenv con privilegios de root.fuente
#!<virtualenv_dir>/bin/python
.Simplemente me topé con esto y para otros que pueden encontrar el mismo problema, Ken tiene razón en que las variables env no se están transfiriendo. La solución que utilicé fue agregar las siguientes líneas a mi script. Esto tiene el beneficio adicional de cargar siempre el entorno virtual directamente desde el script. (Lo que significa que puede usar el script con crontab o launchd sin ninguna otra solución).
Más información aquí: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python
fuente
A veces necesita actualizar $ PATH porque el script ejecuta otros programas. Por ejemplo, pypi-install necesita py2dsc-deb en la RUTA. Este comando funciona:
sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"
fuente