【发布时间】:2013-07-13 18:07:59
【问题描述】:
我现在正在制作一个 python 脚本,我需要使用一些在 bash shell 脚本中设置的环境变量。
bash 脚本类似于:
#! /bin/sh
#sets some names:
export DISTRO="unified"
#export DISTRO="other"
#number of parallel builds
export BB_NUM_THREADS=2
#set build dir
export BUILDDIR=$PWD
通常,我会在 bash 中获取此脚本,然后进行构建。我正在尝试将 python 包裹在整个过程中以对输出进行一些管理,因此我想删除手动 source ./this_script.sh 步骤。
我想做的是从 python 中读取这个脚本,然后使用os.environ 在其中设置变量。 (我知道这不会影响父级,但只会影响当前正在运行的 Python 实例,这很好)
所以为了让我的工作更轻松,我试图找出是否有任何模块可以“解析”bash 脚本并利用其中的环境变量?目前我是手工做的,有点痛苦。
如果不存在这样的模块来完全做我想要的,有没有更pythonic(阅读:更简单/更短)的方式来手动解析文件,现在我正在这样做:
def parse_bash_script(fn):
with open(fn) as f:
for line in f:
if not line[:1] == '#': #ignore comments
if "export" in line:
line = line.replace(" ","").strip()
var = line[6:line.find("=")]
val = line[line.find("=")+1:len(line)]
if "\"" in val:
val = val[1:-1]
os.environ[var]=val
【问题讨论】:
-
脚本真的只是 cmets 和
export var=value行,还是里面有其他东西? -
特别是,在仔细阅读本文之后……您是否需要像 shell 一样评估
BUILDDIR=$PWD?换句话说,BUILDDIR应该以类似/Users/Mike/src/testing的形式结束,还是以文字形式的$PWD? -
@abarnert - 正如你所说,里面还有其他东西。我只是要为“特殊情况”更新我的
parse_bash_script()方法,例如BUILDDIR=$PWD... 在我走这条路之前,我想看看我是否错过了一些更好的选择 -
好的,所以下一个问题是:只执行 sh 脚本是否安全?如果是这样,那可能是最简单的答案。正确处理变量 sh 样式的替换(特别是如果您必须根据 shebang 行指定 sh 还是 bash 来处理它不同的事实)比正确处理引用更难。如果你想完全通用,你打算用
foo=$(ls)这样的东西做什么? -
@abarnert - 是的,只执行该脚本是安全的,这将是我的首选方法......在我看来这是不可能的。我尝试了
sourceing 它和使用Popen的其他一些选项,但我似乎无法做到这一点。我是否错过了在我的 Python 环境中“获取”这个脚本的简单方法?
标签: python bash shell export environment-variables