2

bashスクリプト内で使用するために、Pythonモジュールから文字列を返しています。

これは私がこれまでに持っているものです:

SCRIPT_DIR=/somepath/to/scripts/folder
cd $SCRIPT_DIR/eod

python_cmd='import sys;
            sys.path.append("/somepath/to/scripts/folder/utils"); 
            import settings as st; 
            print " ".join(st.foo())'

# Fix indentation for Python
python_cmd=${python_cmd//'            '/''}

my_array=(`python -c "$python_cmd"`)

上記のスニペットでDRY哲学を使用したいと思います。ただし、文字列/somepath/to/scripts/folderはスクリプト内で繰り返されます。$ SCRIPT_DIRの定義をpython_cmdに渡したいのですが、試しました(python_cmdのパス文字列を$ SCRIPT_DIR / utilsに置き換えたところ、次のエラーで失敗しました:

Traceback (most recent call last):
  File "<string>", line 3, in <module>
ImportError: No module named settings

私は何が間違っているのですか?

ノート:

私はbash4.1.5を実行しています

4

2 に答える 2

3

文字列をわざわざ渡さないでください。Pythonテキストで変更する代わりにsys.path、bashスクリプトでPYTHONPATH環境変数を変更します。それは簡単で、とにかくインポートパスに影響を与えるための好ましい方法です。

パスを設定する方法の例:

SCRIPT_DIR=/somepath/to/scripts/folder
cd $SCRIPT_DIR/eod

export PYTHONPATH=$SCRIPT_DIR
python_cmd='import settings as st; 
            print " ".join(st.foo())'

また、これはコンポーネントを接着する奇妙な方法のように思えますが、より良い方法を推奨するための十分な情報がありません。

于 2012-07-09T13:15:52.740 に答える
2

pythonコマンドは一重引用符で囲まれているため、$SCRIPT_DIR展開されません。これを試して:

python_cmd='import sys;
            sys.path.append("'$SCRIPT_DIR'");
            import settings as st; 
            print " ".join(st.foo())'

そうは言っても、私は修正する答えを選びPYTHONPATHます。

于 2012-07-09T13:18:32.880 に答える