Wie verwende ich eine Python Virtualenv mit Sudo?

47

Ich versuche, eine Python-Umgebung (mithilfe von virtualenv) in einem Verzeichnis, das sich nicht unter / home befindet, von der Systemumgebung zu trennen, da ich sie verwenden muss, um andere Software zu erstellen, auf die mehrere Benutzer zugreifen können müssen. Ich kann das virtualenv in Ordnung erstellen und aktivieren, aber wenn ich sudoeinen Befehl gebe (zum Beispiel, um andere Software zu erstellen oder zu kompilieren), wird das System-Python verwendet (das kann ich aufgrund der verfügbaren Module sagen).

Da es unter Ubuntu nicht gut ist, den Root- Benutzer zu verwenden, gibt es eine Möglichkeit, die sudoVerwendung eines virtuellen Env zu bestimmen? Oder ist das vielleicht nicht der richtige Ansatz und ich sollte eine komplett neue Python-Installation machen?

Ich verwende die 64-Bit-Version von Ubuntu 12.04 (und Python 2.7).

Marco P.
quelle
1
Funktioniert das folgende? sudo $ (welche Python) <script>
John Drinane

Antworten:

57

Das Problem ist mit ziemlicher Sicherheit, dass beim Ausführen sudodie Umgebungsvariablen, Aliase, Funktionen usw. von virtualenv nicht übernommen werden.

Die Lösung wäre, die ausführbare Python-Datei der virtuellen Umgebung explizit mit auszuführen sudo. Wenn Ihre virtuelle Umgebung beispielsweise ./AwesomeProject lautet, können Sie sudo ./AwesomeProject/bin/python <script>das Skript mit der virtuellen Umgebung mit Root-Rechten ausführen.

Ken Kinder
quelle
3
Sie können auch die erste Zeile Ihres Skripts auf die Python-Binärdatei in Ihrer virtuellen Umgebung verweisen lassen. #!<virtualenv_dir>/bin/python.
OrangeTux
Puh, ärgerlich, dass dies bisher nur die Lösung ist. Auf dem Mac verwendet sudo python Python aus der virtuellen Umgebung.
Gaefan
4

Gerade gestolpert darüber und für andere, die das gleiche Problem finden, ist Ken richtig, dass die Umgebungsvariablen nicht übertragen werden. Als Lösung habe ich meinem Skript die folgenden Zeilen hinzugefügt. Dies hat den zusätzlichen Vorteil, dass die virtuelle Umgebung immer direkt aus dem Skript geladen wird. (Das heißt, Sie können das Skript mit crontab oder launchd ohne weitere Problemumgehungen verwenden.)

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

Weitere Hintergrundinformationen finden Sie hier: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python

corey_s
quelle
4

Manchmal muss $ PATH aktualisiert werden, da das Skript andere Programme ausführt. Zum Beispiel benötigt pypi-install py2dsc-deb im PATH. Dieser Befehl funktioniert:sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"

Steveayre
quelle