web-dev-qa-db-ja.com

Bash変数をPythonスクリプトに読み込みます

私はbashスクリプト(test.sh)を実行しており、環境変数(env.shから)をロードします。それはうまくいきますが、私はpythonが既にbashスクリプトにある変数をロードできることを確認しようとしています。

はい、引数として必要な特定の変数を渡す方が簡単だと思いますが、bash変数を取得できるかどうか興味がありました。

test.sh

#!/bin/bash
source env.sh

echo $test1

python pythontest.py

env.sh

#!/bin/bash

test1="hello"

pythontest.py

?
print test1 (that is what I want)
37
Tall Paul

変数をbashでエクスポートする必要があります。そうしないと、bashに対してローカルになります。

export test1

次に、Pythonで

import os
print os.environ["test1"]
48
AMADANON Inc.

設定される環境変数が永続的であると仮定すると、そうではないと思います。 os.environを使用できます。

os.environ["something"]
4
John

これを行う小さなライブラリを作成しました。

https://github.com/aneilbaboo/shellvars-py

4

環境の設定に依存しないsubprocessを使用する別の方法があります。ただし、もう少しコードを追加します。

次のようなシェルスクリプトの場合:

#!/bin/sh
myvar="here is my variable in the Shell script"

function print_myvar() {
    echo $myvar
}

変数の値を取得したり、次のPythonコードのようにシェルスクリプトで関数を呼び出すこともできます。

import subprocess

def get_var(varname):
    CMD = 'echo $(source myscript.sh; echo $%s)' % varname
    p = subprocess.Popen(CMD, stdout=subprocess.PIPE, Shell=True, executable='/bin/bash')
    return p.stdout.readlines()[0].strip()

def call_func(funcname):
    CMD = 'echo $(source myscript.sh; echo $(%s))' % funcname
    p = subprocess.Popen(CMD, stdout=subprocess.PIPE, Shell=True, executable='/bin/bash')
    return p.stdout.readlines()[0].strip()

print get_var('myvar')
print call_func('print_myvar')

両方のShell=Trueは、CMDのシェルコマンドをそのまま処理するために設定され、executable='bin/bash'プロセス置換を使用します。これは、デフォルトではサポートされていません/bin/sh

4
Taejoon Byun