2015-08-18 163 views
0

随着我继续在docker-machine和Django中工作,我正在为我的项目制作一个设置脚本,该脚本会自动检测平台并决定如何设置Docker和所需的容器。自动检测正常工作。有一件事我无法弄清楚是如何自动设置为在Mac OS X上运行目前,该脚本将只是告诉用户需要docker-machine环境变量使用命令在Mac OS X上设置Docker-machine的Python环境变量

eval $(docker-machine env dev) 
手动设置环境变量

其中dev是VM的名称。此提示发生在初始设置成功完成后。用户被告知这样做,因为下面的子进程调用实际上并没有设置环境变量:如果在创建虚拟机,因为虚拟机已经存在时发生错误

subprocess.call('eval $(docker-machine env dev)', shell=True) 

,然后我用的子进程,看看码头工人是已经安装:

check_docker = subprocess.check_call('docker run hello-world', shell=True) 

如果调用成功,那么脚本告诉泊坞窗已安装的用户,然后提示用户手动设置环境变量能够启动所需的Django服务器容器跑步。我原本以为脚本在这种情况下表现正确,但事实证明它只是以这种方式出现,因为我已经手动设置了环境变量。当然,我现在看到docker run命令需要设置环境变量才能工作,并且由于环境变量从未在脚本中设置,因此docker run测试不起作用。那么,我该如何正确设置Python的环境变量?看来使用子进程会导致设置这些变量的错误环境。如果我这样做

subprocess.call('setdockerenv.sh', shell=True) 

其中setdockerenv.sh具有正确的eval命令,然后我遇到了同样的问题,我猜是植根于使用子。 os有什么可以做到这一点,subprocess不能?在Python脚本中这样做很重要,否则让用户手动设置环境变量,然后手动测试以查看是否安装了docker,这是否会影响脚本的使用目的。

+0

您无法使用其他进程修改当前进程的环境; 'eval'可以工作,因为作为一个内置的shell,它不会分叉另一个进程,而是在当前进程中执行。通过运行Python脚本无法修改当前shell的环境。 – chepner

+0

为了回应这个迟到而道歉,但是,是的,那就是问题所在。你能把它变成答案吗?另外,我能够通过使用'os.environ'并手动设置环境变量来解决我的问题。我想这是为运行脚本的Python进程设置env变量,以便子进程可以使用这些变量。 –

回答

1

您不能使用subprocess来更改环境,因为它所做的任何更改都是本地进程。相反,(如您所见),您可以通过os.environ来更改当前的环境,并且该环境会由您随后创建的任何其他进程继承。