Python 从批处理文件启动的脚本看不到批处理文件中设置的环境变量

Python script kicked off from batch file can't see env vars set in batch file

我正在使用 .bat 文件来:

  1. 设置环境变量
  2. 启动 Python 程序(使用这些环境变量)
@ECHO OFF
REM TODO: figure out why Python can't see this
SET MY_ENV_VAR="foo"

CALL C:\code\repo\venv\Scripts\activate
CD /d C:\code\repo
@ECHO ON
REM kick off Python, where os.getenv can't see MY_ENV_VAR
CMD /k run_python_console_script

如果您好奇,run_python_console_script 会启动通过 Entry Point 发出的命令。

当我 运行 os.getenv("MY_ENV_VAR") 它不 return "foo" 时,它 return 是 None。这是为什么?

我不想使用 SETX (docs),我希望环境变量的范围仅限于此批处理脚本。


其他答案

How to access Batch Script variables in python? and 想要调用 .bat 脚本作为子进程。我不想这样做,.bat 脚本是我的父进程。

virtualenvwrapper 支持 postactivate 脚本(参见 and Set specific environment variables activating a Python virtual environment) 但我没有使用 virtualenvwrapper.

来自https://ss64.com/nt/set.html

使用 SET 命令所做的更改不是永久性的,它们仅适用于当前的 CMD 提示并且仅在 CMD window 关闭之前保留。

要在命令行中永久更改变量,请使用 SetX

感谢@Mofi 在评论部分提供了许多可能的尝试!

问题出现在链接到此处的第一条评论中(在环境变量周围放置 ""):

REM TODO: figure out why Python can't see this
SET MY_ENV_VAR="foo"

REM DONE: this works (quotes on outside)
SET "MY_ENV_VAR=foo"

似乎 venv 激活并没有破坏先前存在的环境变量,正如@JohnGordon 在评论中推测的那样。

pip installed on Windows 时,run_python_console_script Entry Point 作为 venv\Scripts\run_python_console_script.exe 安装到 venv