私はIPythonを使用しており、1つのノートブックから別のノートブックの関数を実行したい(異なるノートブック間で関数をカットアンドペーストせずに)。これは可能であり、合理的に簡単ですか?
Qtconsoleを使用して同じカーネルに接続できます。起動時にこれを指定するだけです:
ipython qtconsole --existing kernel-0300435c-3d07-4bb6-abda-8952e663ddb7.json
長い文字列のノートブックを起動した後、出力を見てください。
以下を使用してノートブックサーバーを起動します。
ipython notebook --script
ノートブックを保存します(.ipynb
)as Python scripts(.py
)同様に、インポートすることができます。
または、以下をご覧ください: http://nbviewer.ipython.org/5491090/ これには2つのノートブックが含まれており、一方が他方を実行しています。
IPython 2.0では、単に%run 'my_shared_code.ipynb'
ノートブック間でコードを共有します。たとえば http://nbviewer.ipython.org/Gist/edrex/9044756 を参照してください。
Ipythons %run
magicを使用すると、ノートブックでpythonファイルとipythonスクリプトを実行できます。時々-i
オプションを使用して、ノートブックネームスペースで実行します。詳細については、%run?
を含むセルを実行します。
ipython --script
を使用して、ノートブックを各保存時に.py
ファイルとして保存することも、同じ効果を得るためにc.NotebookManager.save_script=True
ファイルのipython_notebook_config.py
行を保存またはコメント解除することもできます(設定するにはipython profile create
を使用します-Ubuntuではconfigファイルが~/.config/ipython/
にあります)。
Edit:以下は真実ですが、不要です-%run
を直接.ipynb
ファイルにできます。ありがとう Eric 。
インポートするノートブックでipythonマジックを使用する場合、.py
ファイルの名前を.ipy
(ipythonスクリプト)に変更できることがわかりましたが、機能するために最初の行(ファイルエンコーディング宣言を含む)を削除する必要がありました。おそらくもっと良い方法があります!このアプローチは、セルマジックも混乱させる可能性があります(それらはすべて一度に適用されます)。
「書き込みおよび実行」拡張機能もあります。これにより、セルのコンテンツをファイルに書き込み(古いコンテンツを置き換え->コードを更新)、別のノートブックにインポートできます。
https://github.com/minrk/ipython_extensions#write-and-execute
1つのノートブック(2つのセル)
%reload_ext writeandexecute
--
%%writeandexecute -i some_unique_string functions.py
def do_something(txt):
print(txt)
そして、他のノートブックで:
from functions import do_something
do_something("hello world")
はい、できます "あるノートブックから別のノートブックで機能を実行します(異なるノートブック間でカットアンドペーストせずに)"-そして、はい、それは簡単です行う!
tl; dr: python files(*.py
)ファイルシステムで、複数のノートブックで同じコードを使用できるようにします。 (それは簡単です。)
(コードを読み書きするのに非常に優れた完全に優れたコードエディタとIDEがあるのに、なぜノートブックに大量のコードを入れるのですか?適切なバージョン管理の必要性は言うまでもありません!達成しようとしていますが、どのような費用がかかりますか?</rant>
)
詳細:
my_code/foo.py
、(おそらく空)を追加my_code/__init__.py
%cat my_code/foo.py
......そのソースをインラインで表示する(オプションで、外部の再利用可能なソースファイルに以下を追加する)より洗練されたものが必要な場合...
import IPython
from pygments import highlight
from pygments.formatters import HtmlFormatter
from pygments.lexers import get_lexer_for_filename
filename='my_code/foo.py'
with open(filename) as f: code = f.read()
formatter = HtmlFormatter(linenos='inline')
IPython.display.HTML('<style type="text/css">{}</style>{}'.format(
formatter.get_style_defs('.highlight'),
highlight(code, get_lexer_for_filename(filename), formatter)))
お気に入りのコードエディタとIDEは、サポートに感謝します。
ソースノートブックから関数またはアクションをロードするノートブックで次の関数を使用します。
import io
import nbformat
def execute_notebook(nbfile):
with io.open(nbfile, encoding="utf8") as f:
nb = nbformat.read(f, as_version=4)
ip = get_ipython()
for cell in nb.cells:
if cell.cell_type != 'code':
continue
ip.run_cell(cell.source)
次のように使用します:
execute_notebook(path/to/notebook.ipynb)
他のノートブックからノートブックを呼び出します。次のトリックを使用して、「パラメーター」を他のノートブックに渡すこともできます。
配置params辞書最初のセル内 "report_template.ipynb"。
params = dict(platform='iOS',
start_date='2016-05-01',
retention=7)
df = get_data(params ..)
do_analysis(params ..)
そして、別の(より高い論理レベルの)ノートブックで、次の関数を使用して実行します。
def run_notebook(nbfile, **kwargs):
"""
example:
run_notebook('report.ipynb', platform='google_play', start_date='2016-06-10')
"""
def read_notebook(nbfile):
if not nbfile.endswith('.ipynb'):
nbfile += '.ipynb'
with io.open(nbfile) as f:
nb = nbformat.read(f, as_version=4)
return nb
ip = get_ipython()
gl = ip.ns_table['user_global']
gl['params'] = None
arguments_in_original_state = True
for cell in read_notebook(nbfile).cells:
if cell.cell_type != 'code':
continue
ip.run_cell(cell.source)
if arguments_in_original_state and type(gl['params']) == dict:
gl['params'].update(kwargs)
arguments_in_original_state = False
run_notebook("report_template.ipynb", start_date='2016-09-01')
このコマンドは、「report_template」ノートブックの各セルを実行し、params dictionary starting 2番目のセルから
@MikeMullerの良いアイデアはローカルのノートブックでは機能しますが、リモートのノートブックでは機能しません(右?)。リモートサーバー上でipynbコードの個々のセルブロックまたは関数をリモートで呼び出して、結果を通信するためにかなり異常なコードを実行しない限り、プログラムで呼び出しルーチンに結果を戻すことができる方法はないと思います。
@Mattが同じアイデアを提出したとき、私は執筆中だった
_ipython <URI_to_Notebook> --script
_
* .pynbはJSONコンテナであり、実際のpythonスクリプトではありません。ipythonで* .pyをエクスポートするには、
ターゲット* .ipynbが制御していないリモートマシン上にある場合、出力をローカルパスに書き込むことができるように、おそらくファイルをプルする必要があります。 (リモートリソースでこれを呼び出してローカル出力を作成できるかどうかは検討していません。)これが作成されると、*。pyまたはその中の個々の関数をインポートして実行できるはずです。
io.open(nbfile)
を使用して別の* .ipynbファイルを実行するというきちんとした例の@Mattに対する質問は、nbfileをリモートにできるかどうかです。ロングショットのようですが、素晴らしいでしょう...
次に、2つの追加のヒントを示します。
また、ノートブックから%qtconsole
magicを直接実行すると、ノートブックカーネルに自動的に接続されます。
チェックアウト https://github.com/atiasnir/ipnb
それを使用して、ノートブックファイルを標準のpythonモジュール(私は著者です:-))のようにインポートできます。ここでの主な制限は、マジックセルを破棄することです(IPythonをまったく使用しないため)が、それ以外は正常に動作するはずです。