python - 在 Popen 调用之间保持环境
问题描述
我有一个脚本并想做以下事情:
- 激活一个 emscripten 版本(这是可配置的)
- 使用 emscripten cmake 工具链配置 cmake
- 构建项目
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
仍包含旧环境。
解决方案
您可以使用“;”在一个 popen 调用中做到这一点 如果您使用 bash,则作为分隔命令的参数。
Popen(['{0} activate latest'.format(emsdk_bat),";",'emcmake', 'cmake', '-DCMAKE_BUILD_TYPE=Release', '-G "Ninja" ..'], shell=True).communicate()
这仅在您不需要两个输出时才有效,因为它只会返回最终输出,但它将保留第二个命令的实例。
推荐阅读
- ios - 显示 IAP 页面前的收据验证
- c# - Linq 进入数组,然后在数组中查找值并列出到组合框
- laravel - Laravel 5.5 Storage::url() 不使用 S3 返回所需的 url
- apache-spark - 为什么Spark强调schema、mem、storage解耦?
- objective-c - [NSKeyedArchiver archivedDataWithRootObject:在目标 c 上崩溃
- javascript - 如何使用 jquery 在页面加载时生成动态下拉列表?
- express - 在浏览器端缓存 Express REST 路由
- java - AttributeConverter convertToEntityAttribute 循环记录并总是得到空值?
- javascript - 如何从 lodash 获取对象值?
- c# - 空引用在 C# 中基本上是全零指针吗?