2011-11-01 4 views
13

EDITAR: Funciona para root, sudo es el problema. Lee abajo.PYTHONPATH no funciona para sudo en GNU/Linux (funciona para root)

Tengo un directorio con mis propias bibliotecas, p. mis bibliotecas de Python se encuentran en el /home/name/lib/py.
He añadido este directorio para PATH del pitón para todos los usuarios (incluyendo la raíz), añadiendo la siguiente línea a /etc/bash.bashrc:

export PYTHONPATH=$PYTHONPATH:/home/name/lib/py 

Funciona para todos los usuarios (incluyendo la raíz). Pero no funciona para sudo. ¿Hay alguna manera de que pueda hacer sudo usar /etc/bash.bashrc?

EDIT: Más información:

He añadido PYTHONPATH al archivo sudoers así: Defaults env_keep += "HOME PYTHONPATH". No funciona.

env | grep PYTHON: 
    PYTHONDONTWRITEBYTECODE=1 
    PYTHONPATH=/home/name/lib/py 

sudo env | grep PYTHON: 
    PYTHONDONTWRITEBYTECODE=1 

sudo echo $PYTHONPATH: 
    /home/name/lib/py 
+1

También podría intentarlo en [su], pensó que no es necesario migrar. – brc

+2

Especialmente con su edición que el problema es con 'sudo' y no con nada específico de Python, esto probablemente obtenga respuestas más útiles en SU ​​como se menciona, o en unix.stackexchange.com. – agf

+0

@brc Me doy cuenta de eso ahora. Lo arreglé, sin embargo, mira mi respuesta a continuación. – usr

Respuesta

11

La solución en mi caso era eliminar Defaults !env_reset de sudoers.

Pero tenía que mantener Defaults env_keep += "PYTHONPATH" en sudoers.
De hecho, he agregado Defaults env_reset (que restablece las variables de entorno), pero todavía funciona debido a env_keep.

Parece que env_keep y !env_reset entran en conflicto entre sí, pero eso es solo una suposición.


Por lo tanto, todo el proceso:

  1. añadir export PYTHONPATH=/your/custom/path a ~/.bashrc o /etc/bash.bashrc
  2. añadir PYTHONPATH-Defaults env_keep += "ENV1 ENV2 ..." de archivo sudoers
  3. eliminar Defaults !env_reset de archivo sudoers si está presente
+1

Esta solución también funciona en OS X. Simplemente agregue una línea 'Defaults env_keep + =" PYTHONPATH "' en/etc/sudoers en OS X. – user805627

0

Esto probablemente debería publicarse en otro lugar. Pero sudo no procesará el archivo de entorno de forma predeterminada. Si desea invocar que la bandera -i debería ayudarlo. Simulará que los usuarios inicien sesión por primera vez.

Puede que tenga que jugar con dónde está poniendo sus variables también. http://linux.die.net/man/8/sudo

+0

sudo -i tampoco funcionó para mí. Creo que algo de alguna manera entró en conflicto con la opción '! Env_reset' en el archivo sudoers (que en realidad creo que es idéntico a sudo -i). Ver mi respuesta para una explicación completa. – usr

2

Otro consejo:

sudo echo $PYTHONPATH: 
    /home/name/lib/py 

No funcionará.Shell lo interpretará como esto:

1) Ampliar $ PYTHONPATH de variable de entorno, por ejemplo:/usr/lib/python

2) ejecutar "sudo echo/usr/lib/python"

7

El Lo mismo es cierto para la variable PATH, tampoco se incluye en el entorno de súper usuario, aunque esté pasando el indicador de conservar el entorno -E.

estoy usando este comando sudo ahora, sin ninguna otra modificación:

sudo -HE env PATH=$PATH PYTHONPATH=$PYTHONPATH ./bin/myscript 

Ya que es un enfoque alternativo que funciona (para mí) pensé que me gustaría compartir aquí.

Cuestiones relacionadas