programing

IPython 노트북을 명령줄을 통해 파이썬 파일로 변환하려면 어떻게 해야 합니까?

newsource 2023. 6. 19. 21:36

IPython 노트북을 명령줄을 통해 파이썬 파일로 변환하려면 어떻게 해야 합니까?

*.ipynb 파일을 진실의 소스로 사용하고 예약된 작업/작업을 위해 프로그래밍 방식으로 .py 파일로 '컴파일'하는 것을 검토하고 있습니다.

이 작업을 수행하는 유일한 방법은 GUI를 사용하는 것입니다.명령줄을 통해 수행할 수 있는 방법이 있습니까?

저장할 때마다 Python 스크립트를 출력하지 않거나 IPython 커널을 다시 시작하지 않으려면 다음을 수행합니다.

명령줄에서 다음을 사용할 수 있습니다.

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

약간의 해킹으로, 당신은 심지어 사전 보류를 통해 IPython 노트북에서 명령호출할 수 있습니다.!(명령줄 인수에 사용됨).노트북 내부:

!jupyter nbconvert --to script config_template.ipynb

--to script옵션이 추가되었습니다.--to python또는--to=python하지만 언어에 구애받지 않는 노트북 시스템으로 이동하면서 이름이 바뀌었습니다.

이 모든 것을 .*.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()

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 

새 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)

이것이 오래된 실이라는 것을 이해합니다.저는 같은 문제에 직면했고 명령줄을 통해 .pynb 파일을 .py 파일로 변환하고 싶었습니다.

내 검색은 ipynb-py-convert로 갔습니다.

아래의 단계를 따라서 .py 파일을 얻을 수 있었습니다.

  1. "pip install ipynb-py-convert" 설치
  2. 명령 프롬프트를 통해 ipynb 파일이 저장된 디렉토리로 이동합니다.
  3. 명령 입력

> ipynb-py-convert YourFileName.ipynb YourFilename.py

예: . ipynb-py-convert 시작-개글-타이타닉-문제.ipynb는 문제를 해결하기 위해 고민하고 있습니다.파이의

.py 하며, 이에서는 "YourFileName.py "라는 이름의 파이썬 스크립트를 합니다.getting-started-with-kaggle-titanic-problem.py

현재 디렉터리의 모든 *.ipynb 형식 파일을 python 스크립트로 재귀적으로 변환하는 경우:

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

nbconvert 6.07 및 주피터 클라이언트 6.1.12 사용:

주피터 노트북을 파이썬 스크립트로 변환

$ jupyter nbconvert mynotebook.ipynb --to python

주피터 노트북을 출력 파일 이름을 지정하는 파이썬 스크립트로 변환

$ jupyter nbconvert mynotebook.ipnb --to python --output myscript.py

는 Iron 을 " Python"이라고 .a_notebook.ipynb라는 파이썬 a_python_script.py키워드가 태그된 셀 제외remove수동으로 셀에 추가하여 스크립트에서 종료하지 않을 경우 시각화 및 기타 단계는 생략합니다. 이 단계는 노트북을 완료한 후 스크립트에서 실행할 필요가 없습니다.

import nbformat as nbf
from nbconvert.exporters import PythonExporter
from nbconvert.preprocessors import TagRemovePreprocessor

with open("a_notebook.ipynb", 'r', encoding='utf-8') as f:
    the_notebook_nodes = nbf.read(f, as_version = 4)

trp = TagRemovePreprocessor()

trp.remove_cell_tags = ("remove",)

pexp = PythonExporter()

pexp.register_preprocessor(trp, enabled= True)

the_python_script, meta = pexp.from_notebook_node(the_notebook_nodes)

with open("a_python_script.py", 'w', encoding='utf-8') as f:
    f.writelines(the_python_script)

주피터 노트북에서 Python 패키지를 작성하기 위해 설계된 nb_dev라는 매우 좋은 패키지가 있습니다.맘에 들다nbconvert,노트북을 .py 파일로 만들 수 있지만 PyPI에서 테스트, 문서화 및 패키지 등록을 도와주는 많은 훌륭한 추가 저작 기능을 가지고 있기 때문에 더 유연하고 강력합니다.그것은 fast.ai 사람들에 의해 개발되었습니다.

약간의 학습 곡선이 있지만, 문서화가 잘 되어 있고 전반적으로 어렵지 않습니다.

주피터 노트북을 명령줄을 사용하여 일반 파이썬 스크립트로 변환하는 방법은 2가지가 있음을 알게 되었습니다.아래는 주피터 노트북의 예와 두 도구의 출력입니다.

enter image description here

nbconvert 사용

nbconvert는 의주노도다니사인용사서구용입는되의 주피터 입니다.Download as할 수 .명령줄 도구로 사용할 수 있습니다.

jupyter nbconvert --to python notebook.ipynb

Python 스크립트 예제:

주피텍스트 사용

보관할 패키지입니다..ipynb와 동기화된 .py 파입다니를 할 때도 사용할 수 . 또한 변환하는 데 사용할 수 있습니다..ipynb명령줄에 파일이 있습니다.여러 가지 변환 유형을 지원합니다.

가벼운 형식의 Python 스크립트로 변환

jupytext --to py notebook.ipynb             

python 스크립트 예제:

enter image description here

백분율 형식의 Python 스크립트로 변환

jupytext --to py:percent notebook.ipynb 

Python 스크립트 예제:

enter image description here

파일/디렉토리 오류 없음

업무 중인 제 민트[우분투] 시스템에서는 주피터가 이미 설치되어 있고 노트북이 작동했음에도 불구하고,jupyter nbconvert --to script별도의 작업을 수행할 때까지 파일/디렉토리 없음 오류가 발생했습니다.

sudo apt-get install jupyter-nbconvert

그 후에 모든 것이 전환되었습니다.누군가가 같은 오류를 범했을 때를 대비해 추가하고 싶었습니다(로컬 디렉터리에 분명히 있는 노트북에 대한 파일 오류가 없고 하위 명령이 설치되지 않았다는 것을 깨닫는 데 시간이 좀 걸렸다고 생각했기 때문에 혼란스러웠습니다).

여기 있습니다.jq상황에 따라 유용할 수 있는 해결책.기억하세요, 노트는 그냥 json입니다.

jq -r '.cells[] | select(.cell_type  == "code") | .source[] | rtrimstr("\n")' $filename

지정된 솔루션은 단일 .py 파일을 변환하는 경우에만 작동합니다.다음은 디렉터리 및 하위 디렉터리의 모든 .py 파일을 변환하는 솔루션입니다.

먼저 ipynb-py-convert처럼 한 번에 하나의 파일만 변환하는 도구를 설치해야 합니다.

pip 설치 ipynb-py-py-dll

그런 다음 .py 파일과 디렉토리가 있는 폴더의 위치에 cd를 넣습니다.그런 다음 디렉터리 및 하위 디렉터리의 모든 파일에 대해 도구를 재귀적으로 실행합니다.

파워셸에서:

각 ($fin Get-ChildItem ". -Filter *.ipynb -Recurse){ ipynb-py-convert $f.전체 이름 "$($f).전체 이름.부분 문자열(0,$f).전체 이름.길이-6)).py"}

이제 배치 변환을 사용하여 .ipynb에서 .py로 반대 방향으로 변환하려면 다음을 실행할 수 있습니다.

각 ($fin Get-ChildItem ". -Filter *.py -Recurse){ ipynb-py-convert $f.전체 이름 "$($f).전체 이름.부분 문자열(0,$f).전체 이름.길이-3)).ipynb"}

.py 파일을 탐색하는 동안 많은 도움이 되었습니다.저는 프로젝트의 복사본을 만들고, 이 코드를 실행하고, 목성에서 빠르게 코드의 다른 부분을 세포로 테스트합니다.더 많은 사람들에게 도움이 되었으면 좋겠습니다.

저는 이를 달성하기 위한 기능을 구축했습니다.사용자는 그것을 사용하기 위해 아무것도 설치할 필요가 없습니다.

#!/usr/bin/python


# A short routine to convert a Jupyter Notebook to a Python file

import json

def ipynb_to_py(input_ipynb_file,output_py_file=None):
    """
    Generate a Python script (.py) that includes all source code from the input Jupyter notebook (.ipynb).
    
    The user can input a Jupyter Notebook file from the current working directory or from a path.
    
    If the name for output Python file is not specified, 
    the output file name will copy the file name of the input Jupyter Notebook, 
    but the file exention will be changed from ".ipynb" chanegd to ".py".
    And the output Python file will be saved at the same directory of the input Jupyter Notebook.
    For example:
    ipynb_to_py("test-jupyternotebook.ipynb")
    ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb")
    
    The user can also specify an output file name that ends with ".py".
    If the output file name is provided, but no path to output file is added, 
    the file will be saved at the current working directory.
    For example:
    ipynb_to_py("test-jupyternotebook.ipynb","test1.py")
    ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb","test2.py")
        
    The user can save out the file at a target directory by adding a path to the output file.
    For example: 
    ipynb_to_py("test-jupyternotebook.ipynb","./test-outputdir/test3.py")
    ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb","./test-output-dir/test4.py")
    
    This function does not edit or delete the original input Jupyter Notebook file.
    
    Args:
    -----
        input_ipynb_file: The file name string for the Jupyter Notebook (ends with ".ipynb")
        output_py_file (optional): The file name for Python file to be created (ends with ".py"). 
    
    Returns:
    --------
        A Python file containing all source code in the Jupyter Notebook.
        
    Example usages:
    ---------------
        ipynb_to_py("test-jupyternotebook.ipynb")
        ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb")
        ipynb_to_py("test-jupyternotebook.ipynb","test1.py")
        ipynb_to_py("test-jupyternotebook.ipynb","./test-outputdir/test2.py")
        ipynb_to_py("test-jupyternotebook.ipynb","./test-outputdir/test3.py")
        ipynb_to_py("./test-input-dir/test-jupyternotebook.ipynb","./test-output-dir/test4.py")
             
    """
    # Check if the input file is a Jupyter Notebook
    if input_ipynb_file.endswith(".ipynb"):
        
        # Open the input Jupyter Notebook file
        notebook = open(input_ipynb_file)
        
        # Read its content in the json format
        notebook_content = json.load(notebook)

        # Only extract the source code snippet from each cell in the input Jupyter Notebook
        source_code_snippets = [cell['source'] for cell in notebook_content['cells']]
        
        # If the name for output Python file is not specified,
        # The name of input Jupyter Notebook will be used after changing ".ipynb" to ".py".
        if output_py_file == None:
            output_py_file = input_ipynb_file.split('.ipynb')[0]+".py"
        else:
            pass

        # Create a Python script to save out all the extracted source code snippets
        output_file = open(output_py_file,'w')

        # Print out each line in each source code snippet to the output file
        for snippet in source_code_snippets:
            for line in snippet:
                # Use end='' to avoid creating unwanted gaps between lines
                print(line,end = '',file = output_file)
            # At end of each snippet, move to the next line before printing the next one
            print('',sep = '\n',file=output_file)

        # Close the output file
        output_file.close()
        print("The path to output file:",output_py_file)
        
    else:
        print("The input file must be a Jupyter Notebook (in .ipynb format)!")
        
def main():
    pass

if __name__ == "__main__":
    main()
jupyter nbconvert main.ipynb --to python

이 문제가 발생하여 온라인에서 해결책을 찾으려고 했습니다.제가 몇 가지 해결책을 찾았지만, 그들은 여전히 몇 가지 문제를 가지고 있습니다. 예를 들어, 짜증나는 것.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:)

주피터 노트북/랩을 다시 시작해야 작동할 수 있습니다.

%notebook foo.ipynbmagic 명령은 현재 IPython을 "foo.ipynb"로 내보냅니다.

입하여추가정보를 입력하여 정보를 합니다.%notebook?

언급URL : https://stackoverflow.com/questions/17077494/how-do-i-convert-a-ipython-notebook-into-a-python-file-via-commandline