web-dev-qa-db-ja.com

`%% bash`または` %% script` ipythonノートブックセル内のpython変数にアクセスできますか?

%%bashまたは他の%%scriptセル内から現在のpythonカーネル内の変数にアクセスする方法はありますか?

おそらくコマンドライン引数または環境変数として?

46
drevicko

Python変数は、%%bashまたは%%scriptセルの最初の行でアクセスできるため、コマンドラインパラメーターとしてスクリプトに渡すことができます。たとえば、bashを使用すると、次のことができます。

%%bash -s "$myPythonVar" "$myOtherVar"
echo "This bash script knows about $1 and $2"

-sコマンドラインオプションを使用すると、位置パラメーターをbashに渡すことができ、n番目の位置パラメーターの$nを介してアクセスできます。 bashの位置変数に実際に割り当てられるのは、str(myPythonVariable)の結果であることに注意してください。引用文字(または他のbashに敏感な文字)を含む文字列を渡す場合は、バックスラッシュでエスケープする必要があります(例:\")。

引用符は重要です-引用符なしではpython変数(文字列表現)はスペースで分割されるため、myPythonVarstr(myPythonVar)datetime.datetimeだった場合"2013-10-30 05:04:09.797507"として、上記のbashスクリプトは3つの位置変数を受け取り、最初の2つは2013-10-3005:04:09.797507の値を持ちます。出力は次のようになります。

This bash script knows about 2013-10-30 and 05:04:09.797507

変数に名前を付けてLinuxを実行している場合は、次のアプローチを使用します。

%%script env my_bash_variable="$myPythonVariable" bash
echo myPythonVariable\'s value is $my_bash_variable

複数の変数の割り当てを指定できます。再び引用符などのことに注意してください(ここではbashが激しく文句を言います!)。これが機能する理由を理解するには、envのマニュアルページを参照してください。

61
drevicko

python変数をbashコマンドに含めるには、!<some command>構文を使用して実行します。次のように{<variable>}を使用できます。

In [1]: for i in range(3):
   ...:     !echo {i+1}
   ...:     
1
2
3

これは、OPが要求したものとはわずかに異なりますが、スクリプトタスクの実行に密接に関連し、有用です。 この投稿 には、IPythonおよびJupyterノートブック内でシェルコマンドを使用するための優れたヒントと例があります。

35

1つの問題は、bashに与えたい変数がリストである場合、期待どおりに機能しないことです。

たとえば、1つのpython cell:

l = ['A', 'B', 'C']

それを次のセルのマジックオプションに直接渡すと:

%%bash -s "$l"
for i in $1
do
echo $i
done

次のように奇妙に分割されます:

['A',
'B',
'C']

最も簡単な答えは、中括弧{}内にコードを入れて、python bashリストのリストを次のように変換することです。

%%bash -s "{" ".join(l)}"
for i in $1
do
echo $i
done

予想される出力は次のとおりです。

A
B
C
3
mickours

単純な変数以外をbashスクリプトに渡す必要がある場合は、バリエーションに注意してください。

%%bash -s $dict['key1'] $dict['key2'] $dict['key3']

恐ろしく間違っていますが、

%%bash -s {dict['key1']} {dict['key2']} {dict['key3']}

うまく動作します。

2
David Kaufman

いいえ、%%scriptマジックは自動生成され、マジックのプロセス間データ通信を行いません。 (これは%%Rの場合ではありませんが、R peoplesから特別な注意を払った独自のクラスの別個の魔法です)

しかし、それを行う独自の魔法を書くことはそれほど難しくありません。

0
Matt