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 sudo
einen 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 sudo
Verwendung 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).
Antworten:
Das Problem ist mit ziemlicher Sicherheit, dass beim Ausführen
sudo
die 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 Siesudo ./AwesomeProject/bin/python <script>
das Skript mit der virtuellen Umgebung mit Root-Rechten ausführen.quelle
#!<virtualenv_dir>/bin/python
.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.)
Weitere Hintergrundinformationen finden Sie hier: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python
quelle
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"
quelle