将变量传递给环境

时间:2013-12-11 16:38:39

标签: python linux python-2.7 subprocess

如果我的问题不是很清楚,我很抱歉。

我正在尝试创建一个变量,将其传递给linux中的环境。然后,我希望能够在其他地方获得这个变量。到目前为止我在linux命令行上尝试了什么:

local_pc:~/home$ export variable=10
local_pc:~/home$ python -c 'import os; print os.getenv("variable")'
10

一切都很好听。但是当我在python中设置export时,我将无法获得它

subprocess.call(["export","variable=20"],shell = True)
print(os.getenv("variable"))
None

所以我的问题是如何在python

中做xport variable=10

2 个答案:

答案 0 :(得分:2)

您只能为当前进程或其子进程更改环境变量。要在其父进程中更改环境,将需要黑客,例如,使用gdb。

在您的示例中,export variable=10在同一进程中运行,python -c ..命令是子进程(shell)。因此它有效。

在您的Python示例中,您尝试(错误地)在进程中导出变量并在父进程中获取它。

总结:

  • 工作示例:父级为子级设置环境变量
  • 非工作示例:child尝试为父级设置环境变量

要重现您的bash示例:

import os
import sys
from subprocess import check_call

#NOTE: it works but you shouldn't do it, there are most probably better ways    
os.environ['variable'] = '10' # set it for current processes and its children
check_call([sys.executable or 'python', '-c', 
            'import os; print(os.getenv("variable"))'])

子进程要么继承父级环境,要么可以使用env参数显式设置它。

例如,要更改time模块使用的本地时区,您可以在posix系统上更改当前python进程的TZ环境变量:

import os
import time

os.environ['TZ'] = ':America/New_York'
time.tzset()

is_dst =  time.daylight and time.localtime().tm_isdst > 0 
# local time = utc time + utc offset
utc_offset = -time.timezone if not is_dst else -time.altzone
print("%s has utc offset: %.1f hours" % (
    os.environ.get('TZ').lstrip(':'), utc_offset/3600.))

答案 1 :(得分:1)

<强>更新

没有可行的方法通过环境变量在流程上建立通信。

子进程可以从父进程继承环境变量,但是在子进程调用之后对父环境变量的更改将不会传递给子进程,并且子进程的环境更改对父进程完全不透明。所以没办法!

我通过尝试建立循环,基于令牌的消息传递方法来测试它,但我没有看到在进程环境变量之间传递更改的方法。