Wenn Sie einen Python-Unterprozess unter virtualenv ausführen möchten, können Sie dies tun, indem Sie das Skript mit dem Python-Interpreter ausführen, der sich im Verzeichnis / bin / von virtualenv befindet:
import subprocess
# Path to a Python interpreter that runs any Python script
# under the virtualenv /path/to/virtualenv/
python_bin = "/path/to/virtualenv/bin/python"
# Path to the script that must run under the virtualenv
script_file = "must/run/under/virtualenv/script.py"
subprocess.Popen([python_bin, script_file])
Wenn Sie jedoch die virtuelle Umgebung unter dem aktuellen Python-Interpreter anstelle eines Unterprozesses aktivieren möchten, können Sie das folgende activate_this.py
Skript verwenden:
# Doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"
execfile(activate_this_file, dict(__file__=activate_this_file))
subprocess.Popen([venv_python_file, script_file])
?script_file
von einem beliebigen Ort aus auszuführen , oder muss es sich imvirtualenv
Verzeichnis befinden?script_file
betrifft , muss sich no nicht im Verzeichnis virtualenv befinden, sondern kann sich überall befinden.Die einfachste Lösung, um Ihr Skript unter dem Interpreter von virtualenv auszuführen, besteht darin, die Standard-Shebang-Zeile wie am Anfang des Skripts durch den Pfad zum Interpreter Ihres virtualenv zu ersetzen:
Machen Sie das Skript ausführbar:
Führen Sie das Skript aus:
Voila!
quelle
Es stellt sich heraus, dass das Problem nicht einfach ist, aber die Lösung.
Zuerst musste ich ein Shell-Skript erstellen, um den Befehl "source" zu verpacken. Das heißt, ich habe das "." stattdessen, weil ich gelesen habe, dass es besser ist, es als Quelle für Bash-Skripte zu verwenden.
Dann kann ich mit meinem Python-Skript einfach Folgendes tun:
Der ganze Trick liegt im
--rcfile
Argument.Wenn der Python-Interpreter beendet wird, bleibt die aktuelle Shell in der aktivierten Umgebung.
Sieg!
quelle
os.system('/bin/bash --rcfile path/to/env/activate')
? Wenn eine Instanz von bash gestartet wird, wird .bashrc als Argument für die Datei --rcfile verwendet. Geben Sie einfach an, dass die RC-Datei Ihre Aktivierungsdatei ist ... Nein?cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
Um eine andere Python-Umgebung gemäß der offiziellen Virtualenv-Dokumentation auszuführen , können Sie in der Befehlszeile den vollständigen Pfad zur ausführbaren Python-Binärdatei angeben.
Gleiches gilt, wenn Sie mit Ihrer virtuellen Umgebung ein Skript über die Befehlszeile aufrufen möchten. Sie müssen es vorher nicht aktivieren:
Das Gleiche gilt für eine Windows-Umgebung (ob über die Befehlszeile oder über ein Skript):
quelle
Nur eine einfache Lösung, die für mich funktioniert. Ich weiß nicht, warum Sie das Bash-Skript benötigen, das im Grunde genommen einen nutzlosen Schritt macht (irre ich mich?)
Welches macht im Grunde das, was Sie brauchen:
Anstatt die virtuelle Umgebung zu deaktivieren, drücken Sie einfach Ctrl+ Doder beenden Sie das Programm . Ist das eine mögliche Lösung oder wollten Sie das nicht?
quelle
Die untergeordnete Prozessumgebung geht in dem Moment verloren, in dem sie nicht mehr existiert, und das Verschieben des Umgebungsinhalts von dort auf das übergeordnete Element ist etwas schwierig.
Sie müssen wahrscheinlich ein Shell-Skript erzeugen (Sie können eines dynamisch in / tmp generieren), das die Umgebungsvariablen virtualenv in eine Datei ausgibt, die Sie dann im übergeordneten Python-Prozess lesen und in os.environ einfügen.
Oder Sie analysieren einfach das Aktivierungsskript, indem Sie es für die geöffnete Zeile ("bin / enable") verwenden, extrahieren manuell Inhalte und fügen sie in os.environ ein. Es ist schwierig, aber nicht unmöglich.
quelle
Die Top-Antwort funktioniert nur für Python 2.x.
Verwenden Sie für Python 3.x Folgendes:
Referenz: Was ist eine Alternative zu execfile in Python 3?
quelle
Sie sollten alle Ihre
virtualenv
s in einem Ordner erstellen , zvirt
.Angenommen, der Name Ihres virtualenv-Ordners ist virt, wenn Sie ihn nicht ändern
Kopieren Sie die folgenden Zeilen ...
Erstellen Sie eine Shell-Skriptdatei und fügen Sie die obigen Zeilen ein ...
Gewähren Sie Ihrer Datei ausführbare Berechtigungen:
Exportieren Sie nun diesen benutzerdefinierten Ordnerpfad, damit Sie ihn in der Befehlszeile finden können, indem Sie auf die Registerkarte klicken ...
export PATH = $ PATH: "$ HOME / custom"
Jetzt können Sie es von überall aus verwenden, indem Sie einfach den folgenden Befehl eingeben ...
Angenommen, es ist abc dann ...
quelle