
Ich habe das folgende Makefile
env:
source venv/bin/activate
Wenn ich make env
eine virtuelle Python-Umgebung aktiviere, erhalte ich die folgende Fehlermeldung
Quelle venv/bin/activate make: Quelle: Keine solche Datei oder kein solches Verzeichnis make: *** [env] Fehler 1
Aber wenn ich es kopiere source venv/bin/activate
und in der Shell ausführe, läuft es einwandfrei. Muss ich das aktuelle Verzeichnis im Makefile festlegen?
Antwort1
source
ist einSchale eingebautBefehl, keine ausführbare Datei, die Sie von überall außer einer Shell starten können. Was source
funktioniert, ist das Lesen und Ausführen des Inhalts einer Dateiin der aktuellen Shell,ohne eine neue Shell zu starten.
Der Zweck besteht darin, den Status der aktuellen Shell zu ändern (wenn Sie einfach sh venv/bin/activate
, würde Ihre Shell auch den Inhalt des activate
Skripts ausführen, wäre dann aber fertig und würde beendet).
Aber was Sie tun möchten, istÄndern Sie den Status Ihres make
Programms. Das Ausführen des activate
Skripts in einer Shell, die Sie auf irgendeine Weise von starten make
, ändert nichts an der Umgebung, die make
es sieht.
Das liegt daran, dass jedes Programm (A), das von einem anderen Programm (B) gestartet wird, seine eigene Kopie der Umgebung des startenden Programms (B) erhält, die es (A) nach Belieben ändern kann, ohne die Umgebung des startenden Programms (B) zu beeinflussen.
Was Sie also tun möchten, kann nicht funktionieren, nicht einmal theoretisch.
Wenn Sie ein Makefile in einem Venv ausführen müssen, müssen Sie activate
zuerst das Skript als Quelle verwenden und es dann von der so geänderten Shell aus starten make
; nicht umgekehrt.