无法使用 os.environ.get 读取使用 PowerShell 设置的环境变量

Pau*_*aul 5 python powershell environment-variables

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

$env:GOOGLE_ELEVATION_API="the_api-key"
Run Code Online (Sandbox Code Playgroud)

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

from os import environ

key = environ.get("GOOGLE_ELEVATION_API")
Run Code Online (Sandbox Code Playgroud)

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

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

任何指点都会很棒!

mkl*_*nt0 4

  • 通过 PowerShell 的命名空间设置环境变量仅为当前进程$env:定义它。

    • 然而,直接从 PowerShell 会话调用的任何 Python 脚本都会看到此类变量,因为子进程继承了调用者的环境变量。
  • 要在所有进程都能看到的计算机级别持久定义 Windows 环境变量,您必须直接使用 .NET API(从 PowerShell 7.4 开始):

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

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

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

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


[1] 但是,您也可以通过在进程级别重复定义来为当前会话定义它:
$env:GOOGLE_ELEVATION_API = 'the_api-key'