2

現在、python スクリプトを作成しています。bash シェル スクリプトで設定された環境変数を使用する必要があります。

bash スクリプトは次のようなものです。

#! /bin/sh

#sets some names:
export DISTRO="unified"
#export DISTRO="other"

#number of parallel builds
export BB_NUM_THREADS=2

#set build dir
export BUILDDIR=$PWD

通常、このスクリプトを bash でソースしてから、ビルドを行います。source ./this_script.sh出力の管理を行うためにプロセス全体をpythonでラップしようとしているので、手動のステップを削除したいと思います。

私がやりたいのは、このスクリプトを python から読み取り、それを使用os.environして変数を設定することです。(これは親には影響しないことはわかっていますが、現在実行中の Python インスタンスにのみ影響します。それで問題ありません)

作業を簡単にするために、bash スクリプトを「解析」して、内部にある環境変数を利用できるモジュールがあるかどうかを調べようとしています。現在、私はこれを手作業で行っていますが、少し面倒です。

私が望むことを正確に行うためのそのようなモジュールが存在しない場合、一般的にファイルを手動で解析するよりPythonic(読み取り:より簡単/短い)方法はありますか?現在、私はこれを行っています:

def parse_bash_script(fn):
  with open(fn) as f:
    for line in f:
      if not line[:1] == '#':   #ignore comments
        if "export" in line:
          line = line.replace(" ","").strip()
          var = line[6:line.find("=")]
          val = line[line.find("=")+1:len(line)]
          if "\"" in val:
            val = val[1:-1]
          os.environ[var]=val
4

3 に答える 3

1
def parse_bash_script(fn):
  with open(fn) as f:
    for line in f:
      if not line.startswith('#'):   #ignore comments
        if "export" in line:
          var, _, val = line.partition('=')
          var = var.lstrip()
          val = val.rstrip()
          if val.startswith('"'):
            vals = val.rpartition('"')
            val = vals[0][1]+vals[2]
          os.environ[var]=val
于 2013-07-15T18:54:14.490 に答える
0

私は同じ問題を抱えていたので、abarnert からのアドバイスに基づいて、shlex と組み合わせて、制限された bash シェルへのサブプロセス呼び出しとしてソリューションを実装することにしました。

import shlex
import subprocess

filename = '/path/to/file.conf'
o, e = subprocess.Popen(
    ['/bin/bash', '--restricted', '--noprofile', '--init-file', 
     filename, '-i', '-c', 'declare'],
    env={'PATH': ''},
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE).communicate()

if e:
    raise StandardError('conf error in {}: {}'.format(filename, e))

for token in shlex.split(o):
    parts = token.split('=', 1)
    if len(parts) == 2:
        os.environ[parts[0]] = parts[1]

制限付きシェルの利点は、シェル スクリプトの実行時に発生する可能性のある望ましくない、または悪意のある副作用の多くをブロックできることです。bash のドキュメントから:

制限付きシェルは、標準シェルよりも制御された環境をセットアップするために使用されます。以下が許可されていないか実行されないことを除いて、bash と同じように動作します。

  • cd でディレクトリを変更する
  • SHELL、PATH、ENV、または BASH_ENV の値の設定または設定解除
  • / を含むコマンド名の指定
  • への引数として / を含むファイル名を指定します。組み込みコマンド
  • hash 組み込みコマンドの -p オプションの引数としてスラッシュを含むファイル名を指定する
  • 起動時にシェル環境から関数定義をインポートする
  • 起動時にシェル環境から SHELLOPTS の値を解析する
  • >、>|、<>、>&、&>、および >> リダイレクト演算子を使用した出力のリダイレクト
  • exec 組み込みコマンドを使用してシェルを別のコマンドに置き換える
  • enable builtin コマンドに -f および -d オプションを指定して組み込みコマンドを追加または削除する
  • enable builtin コマンドを使用して無効なシェル組み込みコマンドを有効にする
  • コマンド組み込みコマンドに -p オプションを指定する
  • set +r または set +o limited で制限付きモードをオフにします。
于 2016-08-10T14:36:32.523 に答える