【问题标题】:Change environment variables persistently with Python使用 Python 持续更改环境变量
【发布时间】:2016-04-21 15:04:24
【问题描述】:

是否可以使用 Python 3.5 在 Windows 和 Linux 中创建和更新环境变量以使其持久化?

目前我使用这个:

import os
os.environ["MY_VARIABLE"] = "TRUE"

然而,这似乎并没有持久地“存储”环境变量。

【问题讨论】:

  • 环境变量特定于每个进程;您没有将它们存储到某种持久的外部“环境”中。如果要存储数据,请考虑使用文件。
  • 刚发现这个问题:stackoverflow.com/questions/716011/…
  • 破解它的一种方法:你可以exec 一个 bash shell,它会用一个继承新环境变量的 bash 进程覆盖你的 Python 进程。但是,这不会继承任何 bash 特定的东西,比如别名,因为它们不能从父级继承到子级(Python 进程一开始就不会得到它们)。
  • 在 Windows 上,您可以尝试使用 [py_setenv][1] 模块,该模块将通过注册表 [1] 更新用户/系统变量:github.com/beliaev-maksim/py_setenv

标签: python python-3.x


【解决方案1】:

我在这里说的是 Linux,不确定 Windows。

环境变量不是这样工作的。它们是进程的一部分(这是您通过更改 os.environ 来修改的),它们将传播到您的进程的子进程(显然还有它们的子进程)。它们仅在内存中,无法直接“设置和持久化”它们。

不过,有几个配置文件可让您在更精细的基础上设置环境。这些由各种进程读取,可以是系统范围的、特定于用户的、特定于 shell 的、特定类型的进程等。

其中一些是:

  • /etc/environment 用于系统范围的变量
  • /etc/profile 用于 shell(及其子级)
  • /etc 中的其他几个特定于 shell 的文件
  • 用户主目录中的各种点文件,例如 .profile、.bashrc、.bash_profile、.tcshrc 等。阅读 shell 的文档。
  • 我相信还有多种方法可以配置从 GUI 启动的环境变量(例如从 gnome 面板或类似的东西)。

大多数时候,您只想为当前用户设置环境变量。如果您只关心 shell,请以这种格式将它们附加到 ~/.profile:

NAME="VALUE"

【讨论】:

    【解决方案2】:

    “持久化”环境变量的标准方法是使用配置文件。编写您的应用程序以打开配置文件并设置它找到的每个 NAME=VARIABLE 对。可选地,此步骤可以在包装器启动脚本中完成。

    如果您希望“保存”变量的状态,您需要打开配置文件并修改其内容。然后当它再次被读入时,您的应用程序将相应地设置环境。

    您当然可以以其他方式存储配置。例如,在您腌制/搁置的 configuration_settings 类中。然后在程序启动时,您在腌制类中阅读并设置环境。需要了解的重要一点是,进程退出其环境时不会保存。环境是从父进程继承而来的,是分叉的有意副产品。

    配置文件可能如下所示:

    NAME=VALUE
    NAME2=VALUE2
    ...
    

    或者您的配置类可能如下所示:

    class Configuration():
        env_vars = {}
        import os
        def set(name, val):
            env_vars[name] = val
            os.environ[name] = val
        def unset(name):
            del env_vars[name]
            del os.environ[name]
        def init():
            for name in env_vars:
                os.environ[name] = env_vars[name]
    

    我们应用程序的其他地方

    import shelve
    filename = "config.db"
    d = shelve.open(filename)
    
    # get our configuration out of shelve
    config = d['configuration']
    
    # initialize environment
    config.init()
    
    # setting an environment variable
    config.set("MY_VARIABLE", "TRUE")
    
    #unsetting
    config.unset("MY_VARIABLE")
    
    # save our configuration
    d['configuration'] = config
    

    代码没有经过测试,但我认为你明白了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-04
      • 2013-07-05
      • 2014-04-15
      • 2013-01-24
      • 1970-01-01
      • 2011-11-21
      • 2011-08-21
      • 1970-01-01
      相关资源
      最近更新 更多