【问题标题】:Cannot read environment variable set with PowerShell with os.environ.get无法使用 os.environ.get 读取使用 PowerShell 设置的环境变量
【发布时间】:2021-06-02 04:44:11
【问题描述】:

这里有点随机问题。我使用 PowerShell 设置了一个环境变量,如下所示:

$env:GOOGLE_ELEVATION_API="the_api-key"

然后在python中我尝试用这个简单的脚本来阅读它:

from os import environ

key = environ.get("GOOGLE_ELEVATION_API")

这将返回None。如果我在 PowerShell 中查询我的环境变量,它就在那里。如果我用os.environ通过python查询它不是。

我发现的任何结果都没有提到这应该是一个问题,无论是在 PowerShell 方面还是在 python 方面。我没有重新启动我的机器,因为我真的不相信这是应该做的。我确实重新启动了我的 IDE,希望它能以某种方式缓存环境,但幸运的是它没有。

任何指针都会很棒!

【问题讨论】:

  • $env:
  • 啊。是的。当我从 IDE 中的 PowerShell 终端运行此命令时,它可以工作。但是从一个单独的 PSD 窗口中它不会。使变量在机器范围内可用的正确方法是什么? (我想我也可以快速查找。)
  • @MathiasR.Jessen:环境变量存在于 process 级别(试试$env:FOO = 'bar'; Start-ThreadJob { $env:FOO } | Receive-Job -Wait -AutoRemoveJob - 也许这就是您的意思,但请注意单个进程可以托管多个 PowerShell 运行空间)。定期调用的 Python 脚本会自动继承调用 PowerShell 会话的环境变量。
  • @mklement0 Ack,但我怀疑它不能正常工作,因为 python 不是由 powershell 启动的 :-)

标签: python powershell environment-variables


【解决方案1】:
  • 通过 PowerShell 的 $env: 命名空间设置环境变量,为当前进程定义它。

    • 任何从 PowerShell 会话直接调用的 Python 脚本看到这些变量,但是,因为子进程继承调用者的环境变量。
  • 持久所有进程看到的机器级别定义一个 Windows 环境变量,您必须直接使用 .NET API(从 PowerShell 7.1 开始):

# Note: Requires ELEVATION, due to setting at the *machine* level.
[Environment]::SetEnvironmentVariable('GOOGLE_ELEVATION_API', 'the_api-key', 'Machine')

请注意,只有 未来 PowerShell 会话会看到此变量,并且需要重新启动应用程序才能看到新变量通常 em> 也适用于其他正在运行的应用程序。

(例外是那些主动侦听WM_SETTINGCHANGE 消息并刷新其环境作为响应的应用程序,这就是Windows GUI shell (explorer.exe) 所做的。)

有关在 Windows 上持久设置环境变量的更多信息,请参阅this answer

【讨论】:

  • 谢谢,@Paul - 我已经更新了答案,以便在需要重新启动应用程序时更清楚(大多数情况下)。
猜你喜欢
  • 2018-09-03
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
相关资源
最近更新 更多