wake-up-neo.net

Rufen Sie den bin-Ordnerpfad von virtualenv aus dem Skript ab

Ich verwende virtualenvwrapper mit einem Django-Projekt, das eine Verwaltungsaufgabe hat, die automatisch einige Konfigurationsdateien schreibt, sodass der Benutzer dies nur tun muss

./manage.py generate_configuration > much_Nice.conf

Verschieben Sie die Datei dann an eine andere Stelle. Eine der generierten Konfigurationsdateien ist eine Aufgabe für Supervisord, die einen Sellerie-Arbeiter startet. Das Problem, das ich bekomme, ist, dass ich nicht weiß, wie man den Pfad der Sellerie-Programmdatei ausgeben soll, dh im Ordner bin der virtualenv. Im Wesentlichen möchte ich die Ausgabe des Befehls haben

which celery

Eine Option ist sys.executable, den Ordner abrufen (der scheinbar der bin-Ordner der virtualenv ist) und das ist es ... aber ich bin mir nicht sicher.

Gibt es für virtualenv keine Methode, um den Pfad selbst zu ermitteln?

26

Der Pfad zur virtuellen Umgebung befindet sich in der Umgebungsvariablen VIRTUAL_ENV

echo $VIRTUAL_ENV
57
Brad Culberson

Sie können fabric verwenden, um solche Dinge über Python auszuführen

>>> from fabric.api import local
>>> local('which celery')
1
glmvrml

Die Umgebungsvariable VIRTUAL_ENV ist nur verfügbar, wenn die virtuelle Umgebung aktiviert ist.

Zum Beispiel:

$ python3 -m venv myapp
$ source myapp/bin/activate
(myapp) $ python  -c "import os; print(os.environ['VIRTUAL_ENV'])"
/path/to/virtualenv/myapp

Wenn nicht aktiviert, haben Sie eine Ausnahme:

(myapp) $ deactivate
$ myapp/bin/python -c "import os; print(os.environ['VIRTUAL_ENV'])"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib64/python3.4/os.py", line 635, in __getitem__
    raise KeyError(key) from None
KeyError: 'VIRTUAL_ENV'

IMO, sollten Sie sys.executable verwenden, um den Pfad Ihrer ausführbaren Python-Datei Abzurufen und anschließend den Pfad zu Sellerie aufzubauen:

import sys
import os

celery_name = {'linux': 'celery', 'win32': 'celery.exe'}[sys.platform]
celery_path = os.path.join(os.path.dirname(sys.executable), celery_name)
0
Laurent LAPORTE