我的情況是這樣的:我在 Windows 機器上使用 python 和 conda,並且在命令列上主要在 cygwin 中工作。現在 conda 允許不同的 python 環境,類似於 virtualenv,但它僅附帶用於切換環境的 activate.bat 腳本。通常我會做類似的事情source activate env
,但這顯然不適用於非 bash 腳本。我的解決方法如下所示:
cmd /C "activate $1 & bash"
效果很好,但有點不令人滿意,因為它感覺像是一種解決方法。有沒有辦法將子進程的環境變數匯入到父進程中?
答案1
在 中cmd
,變數預設會洩漏到環境中。你必須用setlocal
-包圍你的命令endlocal
來明確避免這種情況。因此,您可以使用建議的方法托馬斯·迪基首先將環境變數放入.bat
文件中。call
我們通常在 Windows 電腦上執行此操作,方法是提供一個setenv.bat
腳本,在呼叫其他腳本之前先在命令提示字元中執行該腳本。
編輯:要為父進程設定環境,我們有時會執行以下操作。只需有一個描述環境的鍵值對檔案:
envkey1=envval1
envkey2=envval2
並在父進程中讀取它並以這種方式調整環境。
我的 Python-fu 不是那麼好,但在 Perl 中你會做類似的事情
open(my $f, '<', 'env.txt');
while (<$f>) {
chomp;
my ($k, $v) = split(m/=/, $_, 2); # assumes '=' as separator
$ENV{$k} = $v; # updates the current environment
}
close($f);
答案2
可能不會。您在通話中使用“&”cmd
幾乎是您能得到的最接近的結果。您也許可以使用以下命令使其看起來更乾淨一些call
對於“activate.bat”腳本。
因為call
不會停止「父」批次程序,所以更接近所要求的 shell「來源」。我在批次檔中使用它,這些檔案在稍後在腳本中使用它們之前會建立環境變數。
但是,尚不清楚您在中指的是哪個「父」進程
cmd /C "activate $1 & bash"
因為您報告您正在將變數傳播activate.bat
到後續bash
命令中(除非您指的是 的父命令cmd
)。