【问题标题】:Script calling batch file that sets environment variables脚本调用设置环境变量的批处理文件
【发布时间】:2023-03-21 07:05:01
【问题描述】:

我需要在 Windows 上编写一个脚本,调用批处理文件来设置一些环境变量,然后执行一些利用这些环境变量的操作。

如果调用脚本本身是一个批处理文件,这可以正常工作。

能够在 Python 中编写调用脚本会有一些优势,但是当我尝试这样做时,批处理文件设置的环境变量在它返回后不会持续存在。我猜那是因为subprocess.check_call(..., shell=True) 生成了一个新的命令 shell 副本,当它在批处理文件末尾终止时,它会带上环境变量。

有没有办法让环境变量在由 Python 调用的批处理文件设置时保持不变,还是让调用脚本本身成为批处理文件更好?

【问题讨论】:

  • 为什么不用os.environ直接在python中设置环境变量呢?我对为什么需要调用这个其他脚本感到困惑
  • @JoranBeasley 因为我没有写批处理文件;它是 Microsoft C++ 附带的,用于为编译器设置环境变量。当然,我可以对其进行逆向工程,但据我所知,对于下一版本的 Microsoft C++,结果可能不正确。
  • oh I c ...你能不能写一个批处理文件来调用那些其他批处理文件然后调用python脚本(所以它得到了环境变量)? afaik 没有办法将孩子的环境变量传回给父母
  • @JoranBeasley 真;将我的脚本放在一个文件中会更简洁,但如有必要,我可以将其拆分为两个文件。
  • 复制或重用来自distutils.msvc9compiler.query_vcvarsall的代码。注意它是如何将& set 添加到命令中以输出环境变量的。

标签: python windows shell batch-file cmd


【解决方案1】:

使用Setx 设置变量。新的 Cmd 提示将立即启动,其他程序在重新启动后。现有的不会拿起它。为此使用Set

Rem Add filter.bat to the path if not in there, setx fails if it's already there

setx path %~dp0;%path% 1>nul 2>nul

【讨论】:

  • rwallace 没有询问有关在注册表中永久设置环境变量的问题。像这样修改PATHLIBPATHLIBINCLUDE 将是一场噩梦。
  • 他的问题是如何让它持续存在。 Persist 意味着在 Windows 中保存到磁盘。规则很简单,每个程序都会获得其父程序的副本。如果 python 希望它的孩子拥有一个包含正确内容的环境副本,那么 PYTHON 必须设置该变量。 Windows 脚本宿主可以做到这一点。只需设置 wshenvironment("path") = "c:\dog"。请注意,它们是 WSH 中的四种环境。选择正确的。
  • 尝试乐趣wmic environment get /format:htable > temp.htm & Start temp.htm
  • rwallace 只需要访问由 vcvarsall.bat 设置的环境变量,为此我链接到了正确的解决方案。根据该值修改注册表中的PATH 是完全错误的。它并不意味着是永久性的。只是临时配置构建环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多