微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将环境变量从bash脚本分配给Python的当前会话

我有许多bash脚本来帮助设置我当前的会话环境变量.我需要设置env变量,所以我可以使用子进程模块在我的python脚本中运行命令.这是我执行bash脚本的方式:

. ./file1.sh

下面是bash脚本的开头:

echo "Setting Environment Variable..."
export HORCMINST=99
echo $HORCMINST
...

有没有办法从python脚本调用这些bash脚本或在python脚本中做类似的事情?

解决方法:

在现有脚本中使用shell = True

首先,就最简单的事情而言 – 如果您使用的是shell = True,您可以告诉shell开始运行未预先修改的预先存在的脚本的内容.

也就是说 – 如果你最初这样做:

subprocess.Popen(['your-command', 'arg1', 'arg2'])

…然后你可以执行以下命令来执行相同的命令,几乎具有相同的安全保证(只有file1.sh的内容受信任的唯一额外漏洞是带外问题,如shellshock ):

# this has the security of passing explicit out-of-band args
# but sources your script before the out-of-process command
subprocess.Popen(['. "$1"; shift; exec "$@"', "_", "./file1.sh",
    "your-command", "arg1", "arg2"], shell=True)

使用/ proc / self / environ在NUL分隔的流中导出环境变量

理想的做法是以明确的形式导出环境变量 – 理想的NUL分隔流 – 然后在Python中解析该流(以非常明确的格式).

假设Linux,您可以导出完整的环境变量集,如下所示:

# copy all our environment variables, in a NUL-delimited stream, to myvars.environ
cat </proc/self/environ >myvars.environ

…或者您可以手动导出一组特定的变量:

for varname in HORCMINST PATH; do
  printf '%s=%s\0' "$varname" "${!varname}"
done >myvars.environ

在Python中读取和解析NUL分隔的流

然后你只需要阅读并解析它们:

#!/usr/bin/env python
env = {}
for var_def in open('myvars.environ', 'r').read().split('\0'):
  (key, value) = var_def.split('=', 1)
  env[key] = value

import subprocess
subprocess.Popen(['your-command', 'arg1', 'arg2'], env=env)

您也可以通过运行os.environ [key] = value立即应用这些变量.

在bash中读取和解析NUL分隔的流

顺便说一句,同样的格式也很容易在bash中解析:

while IFS= read -r -d '' var_def; do
  key=${var_def%%=*}
  value=${var_def#*=}
  printf -v "$key" '%s' "$value"
  export "$key"
done <myvars.environ

# ...put the rest of your bash script here

现在,为什么NUL划分的流?因为环境变量是C字符串 – 与Python字符串不同,它们不能包含NUL.因此,NUL是唯一可以安全地用于分隔它们的角色.

例如,试图使用换行符的人可能会受到包含文字换行符的环境变量的阻碍 – 如果有人在环境变量中嵌入一个简短的Python脚本,那么这是一个非常合理的事件!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐