Come usare un virtualenv python con sudo?


47

Sto cercando di separare un ambiente Python da quello di sistema (usando virtualenv) in una directory che non è in / home, perché ho bisogno di usarlo per costruire altri software che devono essere accessibili a più utenti. Posso creare e attivare il virtualenv tutto bene, ma quando ho sudoqualche comando (ad esempio per creare o compilare altri software), è il pitone di sistema che viene utilizzato (posso dirlo a causa dei moduli disponibili).

Dato che su Ubuntu non è una buona cosa usare l' utente root , c'è un modo per dire sudodi usare un virtualenv? O forse questo non è l'approccio corretto e dovrei fare un'installazione di Python completamente nuova?

Sto usando la versione a 64 bit di Ubuntu 12.04 (e python 2.7).


1
Funziona quanto segue? sudo $ (quale pitone) <script>
John Drinane,

Risposte:


58

Il problema è quasi certamente che quando si esegue sudo, le variabili di ambiente virtualenv, gli alias, le funzioni, ecc. Non vengono trasferite.

La soluzione sarebbe quella di eseguire esplicitamente l'eseguibile Python dell'ambiente virtuale con sudo. Ad esempio, se virtualenv è ./AwesomeProject, è possibile eseguire sudo ./AwesomeProject/bin/python <script>per utilizzare lo script con virtualenv con i privilegi di root.


3
Puoi anche lasciare che la prima riga del tuo script punti al binario Python in virtualenv. #!<virtualenv_dir>/bin/python.
OrangeTux,

Ugh, fastidioso che questa sia l'unica soluzione finora. Su Mac, sudo python utilizza python dall'ambiente virtuale.
Gaefan,

4

Ci siamo imbattuti in questo e per gli altri che potrebbero riscontrare lo stesso problema, Ken ha ragione nel dire che le variabili env non vengono riportate. La soluzione che ho usato è stata quella di aggiungere le seguenti righe al mio script. Ciò ha l'ulteriore vantaggio di caricare sempre l'ambiente virtuale direttamente dallo script. (Significa che puoi usare lo script con crontab o launchd senza altre soluzioni alternative.)

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

Maggiori informazioni qui: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python


4

A volte è necessario l'aggiornamento di $ PATH perché lo script esegue altri programmi. Ad esempio pypi-install ha bisogno di py2dsc-deb nel PERCORSO. Questo comando funziona:sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.