web-dev-qa-db-ja.com

IPython NotebookをコマンドラインでPythonファイルに変換する方法

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

私がこれを行うことを理解している唯一の方法はGUI経由です。コマンドラインを介してそれを行う方法はありますか?

175
Stefan Krawczyk

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

コマンドラインでは、 nbconvert を使用できます:

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

ちょっとしたハックとして、上記のコマンドinin IPython Notebookpre -pending !(コマンドライン引数に使用)。ノートブック内:

!jupyter nbconvert --to script config_template.ipynb

--to script追加 になる前は、オプションは--to pythonまたは--to=pythonでしたが、言語にとらわれない方向に向かって 名前変更 でしたノートブックシステム。

329
wwwilliam

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

jupyter nbconvert --to script *.ipynb
36

これは、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()
14
Valentas

前の例に続きますが新しい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'))
12
Spawnrider

@ Spawnriderの最後のコード行、

fh.writelines(source.encode('utf-8'))

typeError:write()引数はintではなくstrでなければならない

fh.writelines(source) 

でもうまくいきます。

6
BarryC

これは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)
5
justanr

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

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

私はこの問題を抱えていて、解決策をオンラインで見つけようとしました。解決策はいくつか見つかりましたが、ダッシュボードから新しいノートブックを起動したときの迷惑な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
Jiren Jin