簡體   English   中英

Python - 子進程和 env 參數

[英]Python - subprocess and the env argument

我正在完成一個項目,我只剩下一件事要做; 尋找一種使用subprocess啟動程序的優雅方式,包括自定義環境變量集。

貓腳本.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

注意:此帖子已根據評論建議進行了更新。

您的參數var_version=43var_server=35是 Python 整數。 您需要將它們轉換為字符串才能將它們傳遞給子進程。

sub_env = os.environ.copy()
for key in vars(args):
    if key.startswith('var_'):
        sub_env[key] = str(getattr(args, key))

env參數傳遞給subprocess函數(在您的情況下為Popen )。 要修改調用進程的環境,請復制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, …)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM