【问题标题】:Passing a variable to environment将变量传递给环境
【发布时间】:2013-12-29 18:14:33
【问题描述】:

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

我正在尝试创建一个变量,将其传递给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

【问题讨论】:

  • 您可以使用subprocess.Popen 将输出从send.py 传输到receive.py,并将环境变量及其值写入管道。 receive.py 然后需要从管道中读取此数据并适当地更改其环境。不知道你还需要什么。
  • 您能否提供更多详细信息?不要专注于如何去做,只需描述你想要做什么(用简单的英语),然后展示你尝试过的东西(最小但完整的代码示例)以及失败的方式(输入/输出,如果有的话回溯)。
  • 嗨,如果我的问题不是很清楚,我很抱歉。
  • 为什么需要更改环境变量,而不是例如将值作为命令行参数传递或通过子进程的标准输入写入或显式使用管道、套接字或任何其他进程间通信方法?
  • 环境变量不是进行进程间通信的可行方法。这是基本IPC的一个很好的概述;也许其中之一对您有用。 tldp.org/LDP/lpg/node7.html

标签: python linux python-2.7 subprocess


【解决方案1】:

更新

没有可行的方法通过环境变量建立进程间的通信。

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

我通过尝试建立一个循环的、基于令牌的消息传递方法对其进行了测试,但我看不到在进程环境变量之间传递更改的方法。

【讨论】:

  • @Sebastian:我猜是这样,但没有真正尝试过,直到您发表评论。你是绝对正确的。根据您的输入更改答案!
  • env vars 是进程属性,而不是“shell 商品”
【解决方案2】:

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

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

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

总结一下:

  • 工作示例:父母为孩子设置环境变量
  • 无效示例:孩子尝试为父母设置环境变量

重现您的 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.))

【讨论】:

猜你喜欢
  • 2021-09-05
  • 2020-03-27
  • 2017-03-30
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2020-11-07
相关资源
最近更新 更多