私はJupyterのノートブックとPythonカーネルでSparkContextを使って作業しています。同僚は、Sparkイベントをipykernelイベントで結ぶPythonコードを書いています。ノートブック・セルからモジュールをインポートすると、Python 2.7と3.5、Spark 1.6と2.x、Linuxのみをサポートする必要があります。モジュールがロードされた後のPythonスタートアップコードの実行
ここで、すべてのPythonカーネルに対してこのコードを自動的に有効にします。私はsitecustomize.py
に輸入しました。 Spark 2.xではうまく動作しますが、Spark 1.6ではうまく動作しません。 Spark 1.6のカーネルではもうsc
が得られません。何かが台無しになり、matplotlib.cbook
のような無関係のインポートが失敗します。私はタイマを使用して数秒間そのインポートを遅らせると動作します。 明らかに、sitecustomize.py
のコードは、Sparkとipykernelを接続するモジュールをインポートするには早すぎます。
Sparkやipykernelが完全に初期化されるまで、そのインポートを遅らせる方法を探しています。しかし、ノートブックのセルが実行される前に、カーネルの起動の一環として実行する必要があります。 sys.argv
が初期化されるまでコード実行を遅延させるためにthis trickが見つかりました。しかし、私はsc
のようなグローバル変数では動作しないと考えていますが、Pythonのグローバル変数はまだモジュールのローカルであると考えています。これまでのところ、最高のものは、あるモジュールがsys.modules
にあるかどうか毎秒タイマーを使って調べることです。しかし、完全に初期化されたモジュールとロード中のモジュールを区別する方法がわからないため、これはあまり信頼できません。
起動時に遅く実行される起動コードをフックする方法に関するアイデアはありますか? pysparkやipykernelに固有の解決策が私のニーズを満たすでしょう。
に
は、たとえば、あなたが入れてしまうでしょう...それは十分ではありません。私はインポートが確実に機能するようにすることができますが、意図した機能は後で動作するかもしれません。インポート時にロードされたモジュールのリストは同一でした。 –
'PYTHONSTARTUP'環境変数をチェックしましたか? 'python --help'から:*' PYTHONSTARTUP':対話型起動時に実行されるファイル(デフォルトなし)* –
@ piotr-dobrogost:これは対話型起動ではありません。私たちはPythonに '-m ipykernel'を呼び出してIPythonカーネルを起動します。 –