我的情况是这样的:我在 Windows 机器上使用 python 和 conda,在命令行上主要在 cygwin 中工作。现在 conda 允许不同的 python 环境,类似于 virtualenv,但它只附带一个用于切换环境的activation.bat 脚本。通常我会做类似的事情source activate env
,但这显然不适用于非 bash 脚本。我的解决方法如下:
cmd /C "activate $1 & bash"
虽然效果不错,但有点不令人满意,因为它感觉像是一种变通方法。有没有办法将子进程的环境变量导入父进程?
答案1
在 中cmd
,变量默认泄露到环境中。您必须用setlocal
-括住命令endlocal
以明确避免这种情况。因此,您可以使用建议的方法托马斯·迪基首先将您的环境变量放入一个.bat
文件中。call
我们通常在 Windows 机器上执行此操作,通过提供一个setenv.bat
脚本,在调用其他脚本之前首先在命令提示符上运行该脚本。
编辑:为了给父进程设置环境,我们有时会执行以下操作。只需有一个描述环境的键值对文件:
envkey1=envval1
envkey2=envval2
并在父进程中读取它并以此方式调整环境。
我的 Python 能力不是很好,但是在 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
)。