2015-04-22 122 views
2

我正在使用PHP和Laravel框架,並使用.env來設置我的環境變量。然後我從我的PHP環境中調用python腳本,並將結果返回給PHP。我的問題是,在Python中設置的默認os.environ正在被我的PHP環境覆蓋。由PHP覆蓋的Python ENV文件ENV

我的代碼(例子):

<?php 
//Setting up the laravel environment and loading in the $_ENV variable 
exec('python script.py'); 

,然後我的Python:

print os.environ 

print os.environ將返回所有的PHP環境安裝過程中設置我的環境變量。所有默認的環境變量,如PATH,都未被設置或被新的env覆蓋。

我花了一段時間來診斷問題。然而,由於我對Python的知識有限,如何解決這個問題證明是有問題的。有沒有一種方法可以在不影響PHP環境的情況下重新初始化Python環境,反之亦然?基本上我需要兩個進程在環境方面相互獨立,或者我需要設置python環境,然後在返回到PHP之前使用舊值更新它。

如果有人知道如何去做,你會成爲一個救生員。

回答

3

子進程在啓動時從其父進程繼承環境變量。子流程環境中的任何更改都不會傳播到父流程。

就你而言,python腳本是子進程;它從php腳本繼承環境;現在你可以自由地做任何改動os.environ而這些不會在所有影響到PHP的過程,例如在PATH環境變量

os.environ['PATH'] = '/home/foo/bar/bin:' + os.environ['PATH'] 

對於PHP的開始在前面加上了一條新路,$_ENV中的更改不應由子進程繼承,只有明確設置爲putenv的應該由子進程繼承。

+0

感謝您的回覆。你有什麼想法我可能能夠檢索到默認的python環境/重新初始化那個環境嗎? –

+0

@JamesSpence沒有「默認的python環境」。環境*始終*來自父進程。如果這是你想要的,你可以使用'env'命令強制一個「不受歡迎的」環境。 –

+0

@EtanReisner什麼是「被拒絕」的環境?任何機會,你可以推動我在正確的方向鏈接? –