使用
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解析该流(以非常明确的格式)。
# copy all our environment variables, in a NUL-delimited stream, to myvars.environ
cat 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
# ...put the rest of your bash script here
现在,
以NUL分隔的流?因为环境变量是C字符串——与Python字符串不同,它们不能包含NUL。因此,NUL是唯一一个可以安全地用于分隔它们的字符。
包含
一个字面上的换行符——如果有人在环境变量中嵌入一个简短的Python脚本,那么这是一个非常合理的事件!