首页 > 解决方案 > 在 Popen 调用之间保持环境

问题描述

我有一个脚本并想做以下事情:

  1. 激活一个 emscripten 版本(这是可配置的)
  2. 使用 emscripten cmake 工具链配置 cmake
  3. 构建项目

1.我用

from subprocess import Popen

emsdk_path = os.path.join(os.getenv('EMSDK'))
emsdk_bat = os.path.join(emsdk_path, 'emsdk.bat')
Popen('{0} activate latest'.format(emsdk_bat)).communicate()

和 2。

  Popen(['emcmake', 'cmake', '-DCMAKE_BUILD_TYPE=Release', '-G "Ninja" ..'], shell=True).communicate()

第一次调用成功完成,但问题是下一次调用,这是一个不同的Popen调用,因为环境再次重置,所以忘记了关于 emscripten 的所有内容。

有没有办法从一个Popen调用中提取环境状态并在另一个调用中使用它?

我知道env参数,Popen但问题是emsdk.bat更新环境,我看不到如何将它带回 python。

我尝试的另一件事是在第一个进程中将环境写入文件

Popen('{0} activate latest && echo %PATH% > env.txt'.format(emsdk_exe), shell=True).communicate()

env.txt仍包含旧环境。

标签: pythonsubprocesspopen

解决方案


您可以使用“;”在一个 popen 调用中做到这一点 如果您使用 bash,则作为分隔命令的参数。

  Popen(['{0} activate latest'.format(emsdk_bat),";",'emcmake', 'cmake', '-DCMAKE_BUILD_TYPE=Release', '-G "Ninja" ..'], shell=True).communicate()

这仅在您不需要两个输出时才有效,因为它只会返回最终输出,但它将保留第二个命令的实例。


推荐阅读