コマンドラインでIPython NotebookをPythonファイルに変換するにはどうすればよいですか?


258

* .ipynbファイルを真実のソースとして使用し、スケジュールされたジョブ/タスクの.pyファイルにプログラムで「コンパイル」することを検討しています。

これを行うために理解している唯一の方法は、GUIを使用することです。コマンドラインからそれを行う方法はありますか?


1
「真実の源」とはどういう意味ですか?IPython Notebookは単なるjsonファイルです。それらをロードして、Python辞書として操作できます。ソースコードの場合はinputcell_type「コード」と等しいキーを反復する必要があります。このスキーム
theta

1
さて、私は.pyファイルではなくリポジトリに.ipynbを保存したいと思います。したがって、「ビルドステップ」として、自動化システムで実際に使用するために.ipynbを.pyファイルに変換します。そうです、jsonをロードしてコードセルのみを出力することもできましたが、私のためにそれを実行する何かがすでにそこにあるのかどうか疑問に思っていました:)
Stefan Krawczyk

1
@StefanKrawczyk回答者を承認済みとしてマークできますか?私はwwwilliamのasnwerをお勧めします
pedram bashiri

回答:


413

保存するたびにPythonスクリプトを出力したくない場合、またはIPythonカーネルを再起動したくない場合:

上のコマンドラインでは、使用することができますnbconvert

$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb

ハックのビットとして、あなたも上記のコマンドを呼び出すことができる IPythonノート事前保留で!(任意のコマンドライン引数を使用します)。ノートブックの内部:

!jupyter nbconvert --to script config_template.ipynb

--to script追加される前は、オプションは--to pythonまた--to=pythonはでしたが、言語に依存しないノートブックシステムへの移行に伴い名前変更されました。


8
保存ごとに1つ必要な場合は、保存前または保存後のフックを介してjupyterトリガーできますnbconvertContentsManager.pre_save_hookabd FileContentsManager.post_save_hook。保存後フックを追加しますjupyter nbconvert --to script [notebook]
jaimedash

3
逆を行う方法、つまりpythonスクリプトからノートブックに変換する方法はありますか?セルに解析されるいくつかの特殊化されたdocstringがある場合
Sujen Shah 2017

3
フォルダ内のすべてのノートブックを変換するjupyter nbconvert --to script /path/to/notebooks/*.ipynb
openwonk

8
おかげで動作します!# In[ ]:でも、スクリプトに文字列を入れたくない場合は、きれいにしてください。それを行う方法はありますか?
Rishabh Agrahari

1
@RishabhAgrahariはあなただけリンターカスタマイズすることができ、ここでチェックしてくださいjupyter-notebook.readthedocs.io/en/stable/extending/...
MichaelChirico

77

すべての*.ipynbファイルを現在のディレクトリからpythonスクリプトに変換する場合は、次のようなコマンドを実行できます。

jupyter nbconvert --to script *.ipynb

19

以下は、ipythonを使用せずにV3またはV4 ipynbからコードを抽出するための迅速で汚れた方法です。セルの種類などはチェックしません。

import sys,json

f = open(sys.argv[1], 'r') #input.ipynb
j = json.load(f)
of = open(sys.argv[2], 'w') #output.py
if j["nbformat"] >=4:
        for i,cell in enumerate(j["cells"]):
                of.write("#cell "+str(i)+"\n")
                for line in cell["source"]:
                        of.write(line)
                of.write('\n\n')
else:
        for i,cell in enumerate(j["worksheets"][0]["cells"]):
                of.write("#cell "+str(i)+"\n")
                for line in cell["input"]:
                        of.write(line)
                of.write('\n\n')

of.close()

1
Jupyterツールをインストールしない場合は、最良の回答です。
dacracot

1
私はこれが好き。しかし、私がJupyterノートブックから.py形式をダウンロードすると、Windowsを使用している場合でもUNIXの行末を使用していることがわかりました。同じものを生成するにはnewlines='\n'、オープン出力ファイル呼び出しの3番目の引数としてを追加します。(Python 3.x)
RufusVS

16

前の例に従いますが、新しいnbformat libバージョンを使用します。

import nbformat
from nbconvert import PythonExporter

def convertNotebook(notebookPath, modulePath):

  with open(notebookPath) as fh:
    nb = nbformat.reads(fh.read(), nbformat.NO_CONVERT)

  exporter = PythonExporter()
  source, meta = exporter.from_notebook_node(nb)

  with open(modulePath, 'w+') as fh:
    fh.writelines(source.encode('utf-8'))

'コードの最後の行であるfh.writelines(source.encode(' utf-8 '))は' TypeError:write()引数は整数ではなくstrでなければならない 'fh.writelines(source)は機能します。
BarryC 2016年

6

IPython APIからこれを行うことができます。

from IPython.nbformat import current as nbformat
from IPython.nbconvert import PythonExporter

filepath = 'path/to/my_notebook.ipynb'
export_path = 'path/to/my_notebook.py'

with open(filepath) as fh:
    nb = nbformat.reads_json(fh.read())

exporter = PythonExporter()

# source is a tuple of python source code
# meta contains metadata
source, meta = exporter.from_notebook_node(nb)

with open(export_path, 'w+') as fh:
    fh.writelines(source)

4

Jupytextは、このような変換のためにツールチェーンに含めると便利です。ノートブックからスクリプトに変換できるだけでなく、スクリプトからノートブックに戻ることもできます。そして、そのノートブックを実行形式で作成することもできます。

jupytext --to py notebook.ipynb                 # convert notebook.ipynb to a .py file
jupytext --to notebook notebook.py              # convert notebook.py to an .ipynb file with no outputs
jupytext --to notebook --execute notebook.py    # convert notebook.py to an .ipynb file and run it 

どうやらipynb-py-convertもありますここを参照してください
ウェイン

「jupytext」は、内部コマンドまたは外部コマンド、操作可能なプログラム、またはバッチファイルとして認識されません。
アミンチャディ

@AmineChadiをインストールしましたか。その方法については、こちらをご覧ください。コマンドラインインターフェイスとしてノートブックを介して使用している場合は、ノートブックで実行でき%pip install jupytextます。
ウェイン

3

現在のディレクトリにあるすべての* .ipynb形式のファイルを再帰的にPythonスクリプトに変換するには:

for i in *.ipynb **/*.ipynb; do 
    echo "$i"
    jupyter nbconvert  "$i" "$i"
done

3
--to scriptJupiter 4.4.0のデフォルトのHTML出力を回避するには、引数を追加する必要がありました。
trojjer 2017年

0

私はこの問題を抱えており、オンラインで解決策を見つけようとしました。私はいくつかの解決策を見つけましたUntitled.txtが、ダッシュボードから新しいノートブックを開始するときの迷惑な自動作成など、いくつかの問題がまだあります。

だから最終的に私は自分の解決策を書きました:

import io
import os
import re
from nbconvert.exporters.script import ScriptExporter
from notebook.utils import to_api_path


def script_post_save(model, os_path, contents_manager, **kwargs):
    """Save a copy of notebook to the corresponding language source script.

    For example, when you save a `foo.ipynb` file, a corresponding `foo.py`
    python script will also be saved in the same directory.

    However, existing config files I found online (including the one written in
    the official documentation), will also create an `Untitile.txt` file when
    you create a new notebook, even if you have not pressed the "save" button.
    This is annoying because we usually will rename the notebook with a more
    meaningful name later, and now we have to rename the generated script file,
    too!

    Therefore we make a change here to filter out the newly created notebooks
    by checking their names. For a notebook which has not been given a name,
    i.e., its name is `Untitled.*`, the corresponding source script will not be
    saved. Note that the behavior also applies even if you manually save an
    "Untitled" notebook. The rationale is that we usually do not want to save
    scripts with the useless "Untitled" names.
    """
    # only process for notebooks
    if model["type"] != "notebook":
        return

    script_exporter = ScriptExporter(parent=contents_manager)
    base, __ = os.path.splitext(os_path)

    # do nothing if the notebook name ends with `Untitled[0-9]*`
    regex = re.compile(r"Untitled[0-9]*$")
    if regex.search(base):
        return

    script, resources = script_exporter.from_filename(os_path)
    script_fname = base + resources.get('output_extension', '.txt')

    log = contents_manager.log
    log.info("Saving script at /%s",
             to_api_path(script_fname, contents_manager.root_dir))

    with io.open(script_fname, "w", encoding="utf-8") as f:
        f.write(script)

c.FileContentsManager.post_save_hook = script_post_save

このスクリプトを使用するには、それを~/.jupyter/jupyter_notebook_config.py:)に追加します。

動作させるために、jupyterノートブック/ラボを再起動する必要がある場合があることに注意してください。


0

Jupyter NotebooksでPythonパッケージを作成するために設計されたnb_devという非常に優れたパッケージがあります。同じようにnbconvert,、それはの.pyファイルにノートPCを回すことができますが、それは素敵な追加のオーサリングの多くは、あなたがテストの開発を支援ドキュメント、およびは、PyPIにパッケージを登録する機能があるので、それはより柔軟で強力です。それはfast.aiの人々によって開発されました。

学習曲線は少しありますが、ドキュメントは良好で、全体的に難しくありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.