使用Python执行定义环境变量的bash脚本

dms*_*mer 5 python linux variables environment subprocess

我使用下面的代码来执行定义了很多环境变量的 bash 脚本:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import subprocess

# Code used to get the value of variable before the call to my script
command = "echo $MYDIR"
ps = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
my_dir = ps.communicate()[0]
print "my_dir", my_dir

subprocess.Popen(["/bin/sh", "/home/user/env_file"])

# Code used to get the value of established variable
command = "echo $MYDIR"
ps = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
my_dir = ps.communicate()[0]
print "my_dir", my_dir
Run Code Online (Sandbox Code Playgroud)

我的 /home/user/env_file 的内容如下:

#!/bin/bash

export MYDIR=/home/user
export MYDIR2=/home/user2
export MYDIR3=/home/user3
export MYDIR4=/home/user4
export MYDIR5=/home/user5
export MYDIR6=/home/user6
export MYDIR7=/home/user7
export MYDIR8=/home/user8
export MYDIR9=/home/user9
export MYDIR10=/home/user10
export MYDIR11=/home/user11
export MYDIR12=/home/user12
export MYDIR13=/home/user13
export MYDIR14=/home/user14
export MYDIR15=/home/user15
export MYDIR16=/home/user16
Run Code Online (Sandbox Code Playgroud)

当我执行 Python 代码时,我没有获得 my_dir 变量的任何值。我该如何执行此操作?

此致。

Cha*_*ffy 1

进程影响其父进程环境的唯一方法(没有滥用开发/调试设施的丑陋黑客)是父进程的直接参与(这就是为什么运行eval "$(ssh-agent)"-eval其输出是,在这种情况下,需要来自父进程的合作)父进程让其ssh-agent在启动它的进程中设置环境变量)。考虑以下 shell 包装器:

#!/usr/bin/env bash
# Save this script as "envvar-extraction-wrapper"
exec {orig_stdout}>&1 # create a backup of stdout
exec >&2              # and then use stderr while sourcing the child script

source "$@"           # run arbitrary script with arbitrary arguments *in this shell*
                      # note that this means that if it runs "exit", we abort prematurely

while read -r varname; do
  printf '%s\0%s\0' "$varname" "${!varname}" >&$orig_stdout
done < <(compgen -e)
Run Code Online (Sandbox Code Playgroud)

...从以下 Python 中调用:

import subprocess, itertools, os

ps = subprocess.Popen(['envvar-extraction-wrapper', '/home/user/env_file'],
                      stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
(stdout, stderr) = ps.communicate()
items_iter = iter(stdout.split('\0'))
for (k,v) in itertools.izip(items_iter, items_iter):
    os.environ[k]=v
Run Code Online (Sandbox Code Playgroud)