【问题标题】:How do I make environment variable changes stick in Python?如何在 Python 中进行环境变量更改?
【发布时间】:2010-10-04 01:17:54
【问题描述】:

根据我的阅读,对 Python 实例中环境变量的任何更改仅在该实例中可用,并且在实例关闭后消失。有什么办法可以通过将它们提交到系统来让它们坚持下去?

我需要这样做的原因是因为在我工作的工作室中,像 Maya 这样的工具严重依赖环境变量来配置跨多个平台的路径。

我的测试代码是

import os
os.environ['FAKE'] = 'C:\\'

打开另一个 Python 实例并请求 os.environ['FAKE'] 会生成 KeyError

注意:可移植性将是一个问题,但我正在编写的小 API 将能够检查操作系统版本并在必要时触发不同的命令。

也就是说,我已经走上了使用 Windows 注册表技术的路线,并且将简单地编写替代方法,以便在需要时调用其他平台上的 shell 脚本。

【问题讨论】:

  • 对于windows我可以推荐一个模块来通过注册表设置变量。还有 CLI 应用程序:github.com/beliaev-maksim/py_setenv 这对用户/系统级别有很好的控制,并且没有 setx 的长度限制

标签: python environment-variables


【解决方案1】:

您可以在命令行中使用 SETX。

默认情况下,这些操作在 USER 环境变量上进行。 要设置和修改 SYSTEM 变量,请使用 /M 标志

import os
env_var = "BUILD_NUMBER"
env_val = "3.1.3.3.7"
os.system("SETX {0} {1} /M".format(env_var,env_val))

【讨论】:

  • SETX 在 Windows 上的最大问题是它不会改变当前环境,甚至不会改变从它启动的命令 shell - 你必须退出 shell 并开始一个新的。跨度>
  • 我错过了什么 - 这似乎是最简单的?
  • 注意:这可能会截断您的 PATH 环境变量,例如到前 1024 个符号,具体取决于系统。最好先进行备份并制定恢复策略。
  • @SteveBarnes 有没有办法在不重新启动 shell 或 IDE 的情况下设置环境?
  • @datalifenyc - 我没有找到。
【解决方案2】:

通过承诺让他们坚持下去 系统?

我认为你在这里有点困惑。没有“系统”环境。每个进程都有自己的环境作为其内存的一部分。一个进程只能改变它自己的环境。进程可以为其创建的进程设置初始环境。

如果您确实认为需要为系统设置环境变量,则需要考虑在最初加载它们的位置更改它们,例如 Windows 上的注册表或 Linux 上的 shell 配置文件。

【讨论】:

  • 通过“系统”环境变量,Soviut 指的是在系统范围内建立的变量,例如通常 /etc/profile 在 Unix 中或作为 Windows 中的系统(与用户)环境变量。我认为从他的上下文中可以清楚地看到这一点。
【解决方案3】:

在 Windows 下,您可以使用 this recipe 通过注册表对环境变量进行持久更改,尽管这似乎有点过头了。

为了回应布赖恩的问题,您想要完成什么?可能有更简单的方法。

【讨论】:

  • 如何将环境变量从(将成为)系统管理员的标准语言持久设置为矫枉过正??
  • @Jeff,真的吗?您看不到为什么要使环境变量永久化?这是一个古老的问题! :) (提示:在程序之间传递变量)然后,“可能有更简单的方法”是什么意思?更简单的方法是什么? :)
【解决方案4】:

Windows 似乎有更简单的解决方案

import subprocess 
subprocess.call(['setx', 'Hello', 'World!'], shell=True)

【讨论】:

  • 你必须小心使用它,因为如果变量已经存在,它会覆盖当前变量的值。
  • 小心这个,因为它会将你的值截断为前 1024 个字符!
【解决方案5】:

我不相信你能做到这一点;我能想到两种解决方法。

  1. os.putenv 函数为您启动的进程设置环境,即 os.system、popen 等。根据您尝试执行的操作,也许您可​​以拥有一个主 Python 实例来设置变量,然后产生新的实例。

  2. 您可以运行一个 shell 脚本或批处理文件来为您设置它,但这变得不那么可移植了。见这篇文章:

http://code.activestate.com/recipes/159462/

【讨论】:

    【解决方案6】:

    这样想。

    您没有设置 shell 环境变量。

    您正在使用一些给定的环境变量设置生成一个子shell;此子 shell 在修改后的环境中运行您的应用程序。

    【讨论】:

    • 这样想。他正在设置系统范围的默认shell环境变量:)话虽如此,您的观点是有效的,并指出通过替换可执行文件与Python脚本设置环境然后解决问题运行这些可执行文件。 +1
    • @Piotr Dobrogost:这样想吧。一般来说,设置系统范围的默认 shell 环境变量似乎不是一个好主意。去过那里,做到了,不喜欢人们需要独特环境时造成的管理噩梦。
    【解决方案7】:

    根据this discussion,你不能这样做。你想完成什么?

    【讨论】:

    • 我实际上是在尝试制作一个可以跨多个平台调整环境变量的环境切换器。
    • @Soviut,你为什么要更改环境变量?
    • 这样我们就可以在我们的 3D 应用程序使用的不同项目之间切换。它们严重依赖环境变量。
    【解决方案8】:

    你正在 fork 一个新进程,不能像从 shell 启动一个新的 shell 进程那样改变父进程的环境

    【讨论】:

      【解决方案9】:

      您可能想尝试由 Mark Hammond 开发的 Python Win32 Extensions,它包含在 ActivePython 中(或者可以单独安装)。您可以在Hammond's and Robinson's book 中了解如何执行许多与 Windows 相关的任务。

      使用PyWin32访问windowsCOM对象,Python程序可以使用WScript.Shell对象的Environment Property(环境变量的集合)。 p>

      【讨论】:

      • 使用上述方法调用setx标准Windows程序有什么好处?它不再便携,而且更复杂。
      【解决方案10】:

      尝试使用允许您通过注册表设置变量的 py-setenv

      python -m pip install py-setenv

      【讨论】:

        【解决方案11】:

        从 Python 内部?不,做不到!

        如果您未绑定到 Python,则应考虑使用 shell 脚本(sh、bash 等)。 “source”命令允许您运行修改环境的脚本,并像您想要的那样“粘”到您“获取”脚本的 shell。这里发生的是 shell 直接执行脚本而不是创建一个子-process 来执行脚本。

        这将非常便携 - 您可以在 Windows 上使用 cygwin 来执行此操作。

        【讨论】:

        • 我们的想法是尽可能将内容包含在 Python 中,而不是安装像 cygwin 这样的大型库,只是为了从中获取一些 bash 命令。
        • 至于其他答案,这确实可以做到。所以这个答案是错误的。
        • 大声笑。 12 年后,被告知我错了。我将加倍回答我的问题,因为被问到的是“对 Python 实例中环境变量的更改仅在该实例中可用”以及如何使它们“坚持”。您可以随心所欲地更改流程的环境,并且不会按照定义进行更改。如果您更改系统默认环境(根据其他答案),那么它不会更改 python 实例中的环境变量,这似乎是一项要求,因此考虑到问题的提出方式,其他答案是错误的。
        【解决方案12】:

        如果有人可能需要此信息。我意识到这是 7 年前问过的,但即使我有时也忘记了。 .

        是的,有一种方法可以让它们“粘”在 Windows 中。只需转到控制面板,系统,高级系统设置,当系统属性窗口打开时,您应该会看到环境变量的选项(按钮)。 .根据您使用的操作系统(谷歌搜索),实现这一点的过程会有所不同。

        选择那个(点击按钮),然后将打开环境变量窗口。它有 2 个拆分窗口,最上面的一个应该是您的“用户名的用户变量”。 . .选择“新”,然后简单地设置变量。例如我的一个是“Database_Password = mypassword”。

        然后在您的应用程序中,您可以像这样访问它们:import os, os.environ.get('Database_Password')。您可以执行pass = os.environ.get('Database_Password') 之类的操作。

        【讨论】:

        • 不知道为什么这被否决了。这是对问题的回答,除非问题是“如何使用 Python 以编程方式执行此操作”。出于某种原因,我认为他是在专门询问 Windows,但现在我意识到这不是确切的问题。
        • 是的,以编程方式是 OP 所要求的。
        猜你喜欢
        • 2013-01-24
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 2017-07-25
        • 2012-04-19
        • 1970-01-01
        • 2021-05-06
        相关资源
        最近更新 更多