2015-04-22 59 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什么是“被拒绝”的环境?任何机会,你可以推动我在正确的方向链接? –