* .ipynb 파일을 진실의 원천으로 사용하고 계획된 작업 / 작업을 위해 프로그래밍 방식으로 .py 파일로 '컴파일'합니다.
내가 이것을 이해하는 유일한 방법은 GUI를 통하는 것입니다. 커맨드 라인을 통해 할 수있는 방법이 있습니까?
* .ipynb 파일을 진실의 원천으로 사용하고 계획된 작업 / 작업을 위해 프로그래밍 방식으로 .py 파일로 '컴파일'합니다.
내가 이것을 이해하는 유일한 방법은 GUI를 통하는 것입니다. 커맨드 라인을 통해 할 수있는 방법이 있습니까?
답변:
저장할 때마다 Python 스크립트를 출력하지 않거나 IPython 커널을 다시 시작하지 않으려는 경우 :
온 커맨드 라인 , 당신은 사용할 수 있습니다 nbconvert
:
$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb
약간의 해킹으로, IPython 노트북 에서 (명령 줄 인수에 사용 되는) 미리 대기 하여 위 명령 을 호출 할 수도 있습니다!
. 노트북 내부 :
!jupyter nbconvert --to script config_template.ipynb
이전 --to script
에 추가 된 옵션은 --to python
또는 --to=python
이지만 언어에 구애받지 않는 노트북 시스템으로 이동하면서 이름 이 바뀌 었 습니다.
jupyter
할 때마다 하나를 원한다면 nbconvert
사전 또는 사후 저장 후크를 통해 트리거 할 수 있습니다 : ContentsManager.pre_save_hook
abd FileContentsManager.post_save_hook
. 저장 후 후크를 추가합니다jupyter nbconvert --to script [notebook]
jupyter nbconvert --to script /path/to/notebooks/*.ipynb
# In[ ]:
스크립트에서 유형을 원하지 않으면 깨끗하게 만들고 싶습니다. 그렇게 할 방법이 있습니까?
*.ipynb
현재 디렉토리의 모든 파일을 파이썬 스크립트 로 변환 하려면 다음과 같이 명령을 실행할 수 있습니다.
jupyter nbconvert --to script *.ipynb
다음은 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()
newlines='\n'
열린 출력 파일 호출에서 세 번째 인수로를 추가하십시오 . (Python 3.x)
이전 예제를 따르지만 새로운 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'))
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)
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
나는이 문제가 있었고 온라인으로 해결책을 찾으려고 노력했다. 몇 가지 해결책을 찾았지만 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 노트북 / 실험실을 다시 시작해야 작동 할 수 있습니다.
input
키를 반복해야합니다cell_type
. 이 체계를