【问题标题】:Get and Set env vars in Python on Windows在 Windows 上的 Python 中获取和设置环境变量
【发布时间】:2020-08-28 14:36:59
【问题描述】:

我正在尝试设置一个环境变量,我希望它可以从另一个 Windows shell(已经打开)访问:

我试过了:

os.environ['start'] = 'test'

然后在 Windows cmd 中:env.exe | findstr 'start' 什么也不返回。变量“start”不存在。

然后我尝试了:

subprocess.call(['setx.exe', 'start', 'test'])
SUCCESS: Specified value was saved

env.exe | findstr 'start' 仍然没有返回任何内容。

如何从 Windows shell 中获取此变量? 使用 Windows 10 和 python 3。 谢谢!

【问题讨论】:

  • 您是否试图访问子进程中设置的环境变量(提示,您不能这样做 - 请参阅stackoverflow.com/questions/61755986/…)?或者您是否尝试将环境变量传递给子进程?您的问题需要澄清。
  • setx.exe 更新注册表中的环境并将WM_SETTINGCHANGE“环境”消息广播到顶级窗口。这包括 Windows 外壳程序资源管理器,它从注册表重新加载其环境。它不包括控制台应用程序,例如 cmd.exe,它们不创建或拥有任何顶级窗口。

标签: python python-3.x windows environment-variables


【解决方案1】:

您必须从您的 python 代码中调用 Windows SETX,以便从您的代码中保存您的环境值

os.system("SETX {0} {1} /M".format("start", "test"))

应该可以解决问题。不要忘记以管理员身份运行您的脚本。为了让您的命令提示符看到更改,请确保关闭它并打开一个新的命令提示符,然后尝试使用 env.exe 查找您的环境值

【讨论】:

  • 使用 setx.exe 设置每个用户变量会很好,并且不需要以管理员身份运行。但这完全是浪费时间,因为在更新 cmd.exe 的现有实例的环境方面,它无法满足问题的要求。从目标进程外部执行此操作的唯一方法是需要使用未记录的进程数据结构的不可靠代码,以便远程修改另一个进程的环境块。
  • 谢谢,但是在 os.system() 命令之后调用 os.getenv('start') 不会显示任何内容(类型为没有),你怎么解释?
  • SETX 在 Windows 中更新 Environment 键,而不是在子进程中。如果您想在子进程中获取 Environment 密钥并将其保存在 windows 中,您基本上可以将代码修改为:os.environ['start'] = 'test' os.system("SETX {0} {1} /M".format("start", "test")) 或者只需重新启动您的子进程(您的 python 代码)。查看@Eryk Sun 的 cmets
  • OP 希望变量“可以从另一个 Windows shell(已经打开)访问”,就像在已经运行的 cmd.exe 实例中一样。即使一个人可以修改另一个进程的操作系统环境块,这在不同版本的 Windows 之间是不可靠的,因为没有用于此的公共 API,但仍然不能保证 shell 不能从环境的私有副本中工作。这就是为什么我称之为浪费时间。 OTOH,它可以与在现有 shell 中运行的批处理脚本配对,从注册表重新加载环境。
猜你喜欢
  • 2018-04-21
  • 2010-09-23
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
相关资源
最近更新 更多