2017-04-19 8 views
0

を使用して環境変数を定義するbashスクリプトを実行します次は:は、私は、環境変数の多くを定義するbashスクリプトを実行するために、次のコードを使用していますPythonの

#!/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 

私はmy_dir変数の値を取得しません。私はこれをどのように行うことができますか?

よろしくお願いいたします。

+1

プログラムは、起動したプログラムではなく、自身とその子の環境変数のみを変更できます。したがって、Pythonインタプリタから起動するbashスクリプトは、そのPythonインタプリタの変数を設定することはできません。 –

+0

サブプロセスは親環境を変更できないため、スクリプトを実行して実行することはできません。スクリプトを読み込んで代入を解析し、 'os.environ'に代入するPythonコードを書く必要があります。 – Barmar

+0

@Barmar、... wellll。私は誰かに自分のシェルパーサーを書いてもらうことを躊躇しています。私は現在、任意のスクリプトをソースとし、開始時にNUL区切りの形式でstdoutに存在しない実行終了時に存在するすべての環境変数を書き込むシェルで実装されている回答を開始しています。 –

答えて

0

プロセスが親の環境に影響を与える唯一の方法(開発/デバッグ機能を悪用する醜いハックがない場合)は、その親プロセスの直接関与によるものです(この場合、eval "$(ssh-agent)" - evalが実行されます、それを起動したプロセスの環境変数をssh-agentに設定するために、親からの協力が必要です)。次のシェルラッパーを考えてみましょう:

#!/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 "[email protected]"   # 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) 

...次のPythonから呼び出さ:bashスクリプト、env_fileは独自のプロセスで実行され

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 
0

、ので、ここで的環境変数への変更Pythonスクリプトのプロセスに反映されません。このような状況を避けるためにスクリプトを再設計することができれば、それが最適です。そうでなければ、我々はいくつかのハックに頼らざるをえなくてはならない。

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import os 
import subprocess 
import tempfile 

env_file = "/tmp/env_file" 
with open(env_file) as f: 
    original_script_contents = f.read() 

# Duplicate the env_file and add an echo statement at the end 
with tempfile.NamedTemporaryFile() as temp_script: 
    temp_script.write(original_script_contents) 
    temp_script.write('\necho $MYDIR') 
    temp_script.flush() 

    my_dir = subprocess.check_output(["/bin/sh", temp_script.name]) 
    print 'my_dir =', my_dir 

このハックは、重複したファイルの末尾にecho文を追加し、別の一時ファイルにenv_fileの内容を複製し、それを実行し、出力を収集し必要。

また、元のスクリプトは何も出力しないと仮定しています。そうであれば、出力を解析して、探しているものを見つけなければなりません。

関連する問題