¿Cómo usar un python virtualenv con sudo?

47

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 sudoalgú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 sudoque 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).

Marco P.
fuente
1
¿Funciona lo siguiente? sudo $ (which python) <script>
John Drinane

Respuestas:

58

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 ejecutar sudo ./AwesomeProject/bin/python <script>el script con virtualenv con privilegios de root.

Ken Kinder
fuente
3
También puede dejar que la primera línea de su script apunte al binario de Python en su virtualenv. #!<virtualenv_dir>/bin/python.
OrangeTux
Ugh, molesto que esta sea la única solución hasta ahora. En Mac, sudo python usa python desde el entorno virtual.
gaefan
4

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

base_dir = os.path.dirname(os.path.abspath(__file__))
activate_this = os.path.join(base_dir, 'venv/bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))

Más información aquí: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python

corey_s
fuente
4

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"

steveayre
fuente