%%bash
または他の%%script
セル内から現在のpythonカーネル内の変数にアクセスする方法はありますか?
おそらくコマンドライン引数または環境変数として?
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変数(文字列表現)はスペースで分割されるため、myPythonVar
がstr(myPythonVar)
でdatetime.datetime
だった場合"2013-10-30 05:04:09.797507"
として、上記のbashスクリプトは3つの位置変数を受け取り、最初の2つは2013-10-30
と05: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
のマニュアルページを参照してください。
python変数をbashコマンドに含めるには、!<some command>
構文を使用して実行します。次のように{<variable>}
を使用できます。
In [1]: for i in range(3):
...: !echo {i+1}
...:
1
2
3
これは、OPが要求したものとはわずかに異なりますが、スクリプトタスクの実行に密接に関連し、有用です。 この投稿 には、IPythonおよびJupyterノートブック内でシェルコマンドを使用するための優れたヒントと例があります。
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
単純な変数以外をbashスクリプトに渡す必要がある場合は、バリエーションに注意してください。
%%bash -s $dict['key1'] $dict['key2'] $dict['key3']
恐ろしく間違っていますが、
%%bash -s {dict['key1']} {dict['key2']} {dict['key3']}
うまく動作します。
いいえ、%%script
マジックは自動生成され、マジックのプロセス間データ通信を行いません。 (これは%%R
の場合ではありませんが、R
peoplesから特別な注意を払った独自のクラスの別個の魔法です)
しかし、それを行う独自の魔法を書くことはそれほど難しくありません。