我正在完成一个项目,只剩下一件事要做;寻找一种使用subprocess
启动程序的优雅方法,其中包括自定义环境变量集。
cat script.py
#!/usr/bin/env python
import argparse
import subprocess
import sys
import os
parser = argparse.ArgumentParser()
parser.add_argument(
action='store',
nargs='*',
dest="foovar"
)
parser.add_argument('-a', action='store',
type=int,
default='43',
dest="var_version",
help='set the agent version to use. default:(4)')
parser.add_argument('-s', action='store',
type=int,
default='35',
dest="var_server",
help='set the version. default:(5)')
args = parser.parse_args()
sub_env = os.environ.copy()
for key in vars(args):
if key.startswith('var_'):
sub_env[key] = vars(args)[key]
print(vars(args))
print(args) # Namespace(foovar=['james', 'marc'], var_version=43, var_server=35)
for machine in args.foovar:
exit_code = subprocess.call("bash script.sh %s" % machine, env=sub_env, shell=True)
这里是script.sh
#!/bin/bash
if [[ $(printenv | grep 'var_') ]]; then
echo "var_* is working!"
fi
这里输出:
$ ./script.py james marc -a 43 -s 35
{'var_version': 43, 'foovar': ['james', 'marc'], 'var_server': 35}
Namespace(foovar=['james', 'marc'], var_server=35, var_version=43)
Traceback (most recent call last):
File "./script.py", line 44, in <module>
exit_code = subprocess.call("bash script.sh %s" % machine, env=sub_env, shell=True)
File "/usr/lib/python2.7/subprocess.py", line 523, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
raise child_exception
TypeError: execve() arg 3 contains a non-string value
nb:该帖子已根据评论建议进行了更新。
将env
参数传递给subprocess
功能(在您的情况下为subprocess
)。要修改调用过程的环境,请复制Popen
。例如:
os.environ
您的参数os.environ
和sub_env = os.environ.copy()
for key in vars(args):
if key.startswith('var_'):
sub_env[key] = args[key]
for machine in vars(args)['foovar']:
exit_code = subprocess.Popen("…", env=sub_env, …)
是Python整数。您需要将它们转换为字符串,才能将它们传递给子流程。
var_version=43