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

3
这里有一个稍微有些随机的问题。我使用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,希望它会缓存环境变量,但幸运的是它并没有。

有任何指针或建议都将非常感谢!


1
$env: <- 只影响当前运行空间。您将在相同的用户上下文中运行脚本,还是需要一个全局的环境变量? - Mathias R. Jessen
啊,是的。当我在我的IDE中的PowerShell终端运行此命令时,它可以工作。但是从单独的PSD窗口运行时却不行。那么使变量在整个机器上可用的正确方法是什么呢?(我想我也可以快速查找一下。) - Paul
@MathiasR.Jessen:环境变量存在于进程级别(尝试$env:FOO = 'bar'; Start-ThreadJob { $env:FOO } | Receive-Job -Wait -AutoRemoveJob - 也许这就是你的意思,但请注意,单个进程可以承载多个PowerShell runspace)。经常调用的Python脚本会自动继承调用PowerShell会话的环境变量。 - mklement0
1
@mklement0 嗯,但我怀疑它不完全工作是因为python不是由powershell启动的 :-) - Mathias R. Jessen
1个回答

2
  • 通过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会话才能看到这个变量,并且在其他正在运行的应用程序中,通常也需要重新启动应用程序才能看到新变量。
(例外情况是那些积极监听WM_SETTINGCHANGE消息并响应刷新环境的应用程序,这就是Windows GUI shell (explorer.exe)所做的。)
有关在Windows上持久设置环境变量的更多信息,请参见此答案

1
谢谢,@Paul - 我已经更新了答案,以便更清楚地说明何时需要重新启动应用程序(大多数情况下都需要)。 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接