gpt4 book ai didi

python - 在 Python 中模拟 Bash 'source'

转载 作者:IT老高 更新时间:2023-10-28 21:32:00 28 4
gpt4 key购买 nike

我有一个看起来像这样的脚本:

export foo=/tmp/foo                                          
export bar=/tmp/bar

每次构建时,我都会运行“source init_env”(其中 init_env 是上面的脚本)来设置一些变量。

为了在 Python 中完成相同的操作,我运行了这段代码,

reg = re.compile('export (?P<name>\w+)(\=(?P<value>.+))*')
for line in open(file):
m = reg.match(line)
if m:
name = m.group('name')
value = ''
if m.group('value'):
value = m.group('value')
os.putenv(name, value)

但后来有人决定最好在init_env文件中添加如下一行:

export PATH="/foo/bar:/bar/foo:$PATH"     

显然我的 Python 脚本崩溃了。我可以修改 Python 脚本来处理这一行,但是稍后当 someone 提出要在 init_env 文件中使用的新功能时,它就会中断。

问题是是否有一种简单的方法可以运行 Bash 命令并让它修改我的 os.environ

最佳答案

您的方法的问题是您试图解释 bash 脚本。首先,您只需尝试解释导出语句。然后你注意到人们正在使用变量扩展。后来人们会将条件放在他们的文件中,或者处理替换。最后,您将拥有一个完整的 bash 脚本解释器,其中包含大量错误。不要那样做。

让 Bash 为您解释文件,然后收集结果。

你可以这样做:

#! /usr/bin/env python

import os
import pprint
import shlex
import subprocess

command = shlex.split("env -i bash -c 'source init_env && env'")
proc = subprocess.Popen(command, stdout = subprocess.PIPE)
for line in proc.stdout:
(key, _, value) = line.partition("=")
os.environ[key] = value
proc.communicate()

pprint.pprint(dict(os.environ))

确保在 bash 无法source init_env、bash 本身无法执行、子进程无法执行 bash 或任何其他错误时处理错误。

命令行开头的 env -i 创建一个干净的环境。这意味着您只能从 init_env 获取环境变量。如果你想要继承的系统环境,那么省略 env -i.

阅读 subprocess 上的文档了解更多详情。

注意:这只会捕获使用 export 语句设置的变量,因为 env 只会打印导出的变量。

享受吧。

请注意 Python documentation说如果你想操纵环境,你应该直接操纵 os.environ 而不是使用 os.putenv()。我认为这是一个错误,但我离题了。

关于python - 在 Python 中模拟 Bash 'source',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3503719/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com