使用 Python 持续更改环境变量

Rob*_*uch 4 python python-3.x

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

目前我使用这个:

import os
os.environ["MY_VARIABLE"] = "TRUE"
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不会持久地“存储”环境变量。

Aar*_*onI 5

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

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

然而,有几个配置文件允许您在更细粒度的基础上设置环境。这些由各种进程读取,并且可以是系统范围的、特定于用户的、特定于外壳的、特定于特定类型的进程等。

他们之中有一些是:

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

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

NAME="VALUE"


ktb*_*biz 5

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

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

您当然可以以其他方式存储配置。例如,在您pickle/shelve的configuration_settings类中。然后在程序启动时,您读取 pickled 类并设置环境。需要理解的重要一点是,当进程退出时,其环境不会被保存。环境是从父进程继承的,作为分叉的有意副产品。

配置文件可能如下所示:

NAME=VALUE
NAME2=VALUE2
...
Run Code Online (Sandbox Code Playgroud)

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

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]
Run Code Online (Sandbox Code Playgroud)

我们应用程序中的其他地方

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
Run Code Online (Sandbox Code Playgroud)

代码没有经过测试,但我想你已经明白了要点。