명령 줄을 통해 IPython Notebook을 Python 파일로 어떻게 변환합니까?


258

* .ipynb 파일을 진실의 원천으로 사용하고 계획된 작업 / 작업을 위해 프로그래밍 방식으로 .py 파일로 '컴파일'합니다.

내가 이것을 이해하는 유일한 방법은 GUI를 통하는 것입니다. 커맨드 라인을 통해 할 수있는 방법이 있습니까?


1
"진리의 근원"이란 무엇을 의미합니까? IPython 노트북은 단지 json 파일입니다. 그것들을로드하고 파이썬 사전으로 조작 할 수 있습니다. 소스 코드의 경우 'code'와 동일한 input키를 반복해야합니다 cell_type. 이 체계를
theta

1
.ipynb를 .py 파일이 아닌 저장소에 저장하고 싶습니다. 따라서 '빌드 단계'로서 자동화 시스템에서 실제로 사용하기 위해 .ipynb를 .py 파일로 변환합니다. 당신은 그냥 코드 만 세포 json으로 출력을로드 할 수, 맞아,하지만 :) 나를 위해했던 이미 무언가이 있었는지 궁금 해서요
스테판 크라우 지크

1
@StefanKrawczyk aswer를 수락 한 것으로 표시 할 수 있습니까?
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
저장 jupyter할 때마다 하나를 원한다면 nbconvert사전 또는 사후 저장 후크를 통해 트리거 할 수 있습니다 : ContentsManager.pre_save_hookabd FileContentsManager.post_save_hook. 저장 후 후크를 추가합니다jupyter nbconvert --to script [notebook]
jaimedash

3
파이썬 스크립트에서 노트북으로 반대로 변환하는 방법이 있습니까? 예를 들어 셀로 구문 분석되는 특수한 docstring이 있습니까?
Sujen Shah

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현재 디렉토리의 모든 파일을 파이썬 스크립트 로 변환 하려면 다음과 같이 명령을 실행할 수 있습니다.

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'열린 출력 파일 호출에서 세 번째 인수로를 추가하십시오 . (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 () 인수는 int가 아닌 str이어야합니다'를 제공합니다. fh.writelines (source)는 작동합니다.
BarryC

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'는 내부 또는 외부 명령, 실행 가능한 프로그램 또는 배치 파일로 인식되지 않습니다. ???
Amine

@AmineChadi를 설치 했습니까? 이를 수행하는 방법 은 여기 를 참조 하십시오 . 노트북을 통해 명령 줄 인터페이스로 사용하는 경우 노트북 %pip install jupytext에서 실행할 수 있습니다 .
웨인

3

현재 디렉토리의 모든 * .ipynb 형식 파일을 파이썬 스크립트로 재귀 적으로 변환하려면 다음을 수행하십시오.

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

3
--to scriptJupiter 4.4.0에서 기본 HTML 출력을 피하기 위해 인수 를 추가해야했습니다 .
trojjer

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 파일로 변환 할 수있는 PyPI에서 테스트, 문서화 및 패키지를 개발하는 데 도움이되는 훌륭한 추가 작성 기능이 있기 때문에 더욱 유연하고 강력합니다. 그것은 fast.ai 사람들에 의해 개발되었습니다.

약간의 학습 곡선이 있지만 문서는 훌륭하고 전반적으로 어렵지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.