2015-08-18 86 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來更改當前的環境,並且該環境會由您隨後創建的任何其他進程繼承。