2011-11-01 12 views
13

MODIFICA: Funziona per root, sudo è il problema. Leggere sotto.PYTHONPATH non funziona per sudo su GNU/Linux (funziona per root)

Ho una directory con le mie librerie, ad es. le mie librerie Python si trovano a /home/name/lib/py.
ho aggiunto questo elenco per PATH di Python per tutti gli utenti (compresi i root) aggiungendo la seguente riga al /etc/bash.bashrc:

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

Funziona per tutti gli utenti (compresi i root). Ma non funziona sudo. C'è un modo in cui posso usare sudo /etc/bash.bashrc?

EDIT: Per maggiori informazioni:

Ho aggiunto PYTHONPATH a sudoers file in questo modo: Defaults env_keep += "HOME PYTHONPATH". Non funziona.

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

sudo env | grep PYTHON: 
    PYTHONDONTWRITEBYTECODE=1 

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

Si potrebbe provare anche su [su], ho pensato che non credo che sia necessario migrare. – brc

+2

Specialmente con la tua modifica che il problema è con 'sudo' e non qualcosa di specifico su Python, probabilmente otterresti risposte più utili su SU come menzionato, o su unix.stackexchange.com. – agf

+0

@brc me ne accorgo ora. L'ho risolto però - vedi la mia risposta qui sotto. – usr

risposta

11

La correzione nel mio caso era quella di rimuovere Defaults !env_reset da sudoers.

Ma, ho dovuto mantenere Defaults env_keep += "PYTHONPATH" in sudoers.
In realtà ho aggiunto Defaults env_reset (che reimposta le variabili di ambiente), ma funziona ancora a causa di env_keep.

Sembra che env_keep e !env_reset siano in conflitto tra loro, ma è solo un'ipotesi.


Così, l'intero processo:

  1. aggiungere export PYTHONPATH=/your/custom/path a ~/.bashrc o /etc/bash.bashrc
  2. aggiungere PYTHONPATH-Defaults env_keep += "ENV1 ENV2 ..." in sudoers il file
  3. rimuovere Defaults !env_reset da sudoers file se presente
+1

Questa soluzione funziona anche su OS X. Basta aggiungere una riga 'Defaults env_keep + =" PYTHONPATH "' in/etc/sudoers su OS X. – user805627

0

Questo dovrebbe probabilmente essere pubblicato altrove. Ma sudo non elaborerà il file dell'ambiente per impostazione predefinita. Se vuoi invocare che il flag -i dovrebbe aiutarti. Simulerà il login iniziale degli utenti.

Potrebbe essere necessario giocare con dove stai mettendo le tue variabili. http://linux.die.net/man/8/sudo

+0

anche sudo -i non ha funzionato per me. Penso che qualcosa sia in qualche modo in conflitto con l'opzione '! Env_reset' nel file sudoers (che penso sia in realtà identico a sudo -i). Vedi la mia risposta per una spiegazione completa. – usr

2

Un altro suggerimento:

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

Non funzionerà.Shell interpreta così:

1) ampliare $ PYTHONPATH da variabile env ad esempio:/usr/lib/python

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

7

L' lo stesso vale per la variabile PATH, anche se non viene trasferita nell'ambiente superutente, anche se si passa il flag di ambiente di conservazione -E.

sto usando questo comando sudo ora senza altre modifiche:

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

Poiché si tratta di un approccio alternativo che funziona (per me) ho pensato di condividere qui.