Programing

버전 제어에서 IPython 노트북 사용

lottogame 2020. 2. 10. 22:01
반응형

버전 제어에서 IPython 노트북 사용


IPython 노트북을 버전 관리 상태로 유지하는 좋은 전략은 무엇입니까 ?

노트북 형식은 버전 제어에 적합합니다. 노트북과 출력을 버전 제어하려는 경우 꽤 잘 작동합니다. 성가심은 특히 영화와 음모에 큰 이진 얼룩이 될 수있는 셀 출력 (일명 "빌드 제품")을 제외하고 입력을 버전 제어 만하고 싶을 때 발생합니다. 특히, 나는 다음과 같은 좋은 워크 플로우를 찾으려고 노력하고 있습니다.

  • 출력 포함 또는 제외 중에서 선택할 수 있습니다.
  • 원하지 않는 경우 실수로 출력을 커밋하지 못하게합니다.
  • 로컬 버전으로 출력을 유지할 수 있습니다.
  • 내 버전 제어 시스템을 사용하여 입력의 변경 사항을 볼 수 있습니다 (즉, 입력을 버전 제어 만하지 만 로컬 파일에 출력이있는 경우 입력이 변경되었는지 확인하고 싶습니다 (커밋 필요) 버전 제어 상태 명령을 사용하면 로컬 파일에 출력이 있으므로 항상 차이를 등록합니다.)
  • 업데이트 된 깨끗한 노트북에서 작업중인 노트북 (출력이 포함 된)을 업데이트 할 수 있습니다. (최신 정보)

언급했듯이 출력을 포함하기로 선택한 경우 ( 예 : nbviewer사용할 때 바람직 함 ) 모든 것이 정상 입니다. 문제는 출력을 버전 제어하고 싶지 않을입니다. 노트북의 출력을 제거하기위한 몇 가지 도구와 스크립트가 있지만 다음과 같은 문제가 자주 발생합니다.

  1. 실수로 출력이있는 버전을 커밋하여 저장소를 오염시킵니다.
  2. 버전 제어를 사용하려면 출력을 지우지 만 실제로는 로컬 사본에 출력을 유지하려고합니다 (예를 들어 재생산하는 데 시간이 걸리는 경우가 있음).
  3. 출력을 제거하는 일부 스크립트는 Cell/All Output/Clear메뉴 옵션 과 비교하여 형식을 약간 변경 하여 diff에 원하지 않는 노이즈를 만듭니다. 이것은 일부 답변으로 해결됩니다.
  4. 깨끗한 버전의 파일로 변경 사항을 가져올 때 모든 것을 다시 실행하지 않고도 변경 사항을 작업 전자 필기장에 통합하는 방법을 찾아야합니다. (최신 정보)

아래에서 논의 할 몇 가지 옵션을 고려했지만 아직 포괄적 인 솔루션을 찾지 못했습니다. 전체 솔루션을 사용하려면 IPython을 약간 변경하거나 간단한 외부 스크립트를 사용해야합니다. 현재 mercurial을 사용 하고 있지만 git 과 함께 작동 하는 솔루션을 원합니다. 이상적인 솔루션은 버전 제어 불가지론입니다.

이 문제는 여러 번 논의되었지만 사용자의 관점에서 명확하거나 명확한 해결책은 없습니다. 이 질문에 대한 답은 결정적인 전략을 제공해야합니다. 최신 (심지어 개발 된) 버전의 IPython 또는 쉽게 설치되는 확장 기능이 필요한 경우에 좋습니다.

업데이트 : Gregory Crosswhite의 제안을 사용하여 저장 할 때마다 버전을 저장하는 수정 된 노트북 버전을 가지고 놀고 있습니다. 이것은 대부분의 제약 조건을 만족하지만 다음 사항을 해결하지 않은 채로 둡니다..clean

  1. 이것은 아직 표준 솔루션이 아닙니다 (ipython 소스를 수정해야합니다. 간단한 확장으로이 동작을 수행 할 수있는 방법이 있습니까? 일종의 저장 고리가 필요합니다.
  2. 현재 워크 플로에서 발생하는 문제는 변경 사항을 가져 오는 것입니다. 이것들은 .clean파일로 들어온 다음 어떻게 든 내 작업 버전에 통합되어야합니다. (물론, 항상 노트북을 다시 실행할 수는 있지만, 특히 일부 결과가 긴 계산, 병렬 계산 등에 의존하는 경우 고통 스러울 수 있습니다.) 아직이 문제를 해결하는 방법에 대한 좋은 아이디어가 없습니다. . 아마도 ipycache 와 같은 확장과 관련된 워크 플로 는 작동 할 수 있지만 약간 복잡해 보입니다.

노트

출력 제거 (스트라이핑)

  • 노트북이 실행 중이면 Cell/All Output/Clear메뉴 옵션을 사용 하여 출력을 제거 할 수 있습니다 .
  • 출력을 제거하기위한 스크립트가 있습니다 (예 : 출력 을 제거하지만 노트북 인터페이스를 사용하는 것과 동일한 출력을 생성하지 않는 스크립트 nbstripout.py) . 이것은 결국 ipython / nbconvert 저장소에 포함되었지만 변경 사항이 이제 ipython / ipython에 포함되어 있음을 알리는 폐쇄 되었지만 해당 기능은 아직 포함되지 않은 것 같습니다. (갱신) 그 존재는 말했다 그레고리 Crosswhite의 솔루션 이, 심지어 호출하지 않고 아주 쉽게 할 수 있음을 보여줍니다 ipython / nbconvert은따라서이 접근 방식은 제대로 연결될 수 있으면 가능할 것입니다. 그러나 각 버전 제어 시스템에 연결하는 것은 좋은 생각처럼 보이지 않습니다 (어쨌든 노트북 메커니즘에 연결해야 함).

뉴스 그룹

이슈

풀 요청


다음은 git을 사용한 솔루션입니다. 평소와 같이 추가하고 커밋 (및 diff) 할 수 있습니다.이 작업은 작업 트리를 변경하지 않으며 동시에 노트북을 다시 실행해도 git history가 변경되지 않습니다.

다른 VCS에도 적용 할 수 있지만 요구 사항 (최소한 VSC 불가지론)을 충족하지 못한다는 것을 알고 있습니다. 아직도, 그것은 나에게 완벽하며, 특히 훌륭하지는 않지만 많은 사람들이 이미 그것을 사용하고 있지만, 인터넷 검색을 통해 그것을 구현하는 방법에 대한 명확한 지침을 찾지 못했습니다. 따라서 다른 사람들에게 유용 할 수 있습니다.

  1. 이 내용이 담긴 파일을 어딘가에 저장하십시오 (다음을 가정 해 봅시다 ~/bin/ipynb_output_filter.py)
  2. 실행 가능하게 만들기 ( chmod +x ~/bin/ipynb_output_filter.py)
  3. ~/.gitattributes다음 내용으로 파일을 만듭니다.

    *.ipynb    filter=dropoutput_ipynb
    
  4. 다음 명령을 실행하십시오.

    git config --global core.attributesfile ~/.gitattributes
    git config --global filter.dropoutput_ipynb.clean ~/bin/ipynb_output_filter.py
    git config --global filter.dropoutput_ipynb.smudge cat
    

끝난!

한계 :

  • 그것은 git에서만 작동합니다.
  • git에서 분기 somebranch하고 git checkout otherbranch; git checkout somebranch있고 작업하는 경우 일반적으로 작업 트리가 변경되지 않을 것으로 예상합니다. 대신 두 가지에서 소스가 다른 노트북의 출력 및 셀 번호 매기기가 손실됩니다.
  • 더 일반적으로, Gregory의 솔루션과 마찬가지로 출력의 버전이 전혀 지정되지 않았습니다. 체크 아웃과 관련된 작업을 수행 할 때마다 그냥 버리지 않기 위해 별도의 파일에 저장하여 접근 방식을 변경할 수 있습니다 (그러나 위의 코드가 실행될 때 커밋 ID는 알려지지 않았습니다!), 가능하면 버전을 지정할 수 있습니다 (그러나 git commit notebook_file.ipynb최소한 git diff notebook_file.ipynbbase64 가비지에서 벗어날 수 는 있지만 이보다 더 많은 것이 필요합니다 ).
  • 즉, 실수로 일부 출력이 포함 된 풀 코드 (예 :이 방법을 사용하지 않는 다른 사람이 커밋)를 수행하면 출력이 정상적으로 체크 아웃됩니다. 로컬로 생성 된 출력 만 손실됩니다.

내 솔루션은 개인적으로 생성 된 물건을 버전 화하는 것을 좋아하지 않는다는 사실을 반영합니다. 출력과 관련된 병합을 수행하면 출력 이나 생산성 또는 둘 다를 무효화 할 수 있음을 거의 알 있습니다.

편집하다:

  • 내가 제안한대로 솔루션을 채택하면 (즉, 전 세계적으로) git repo 가 버전 출력 원할 경우 문제가 발생 합니다. 당신이 원하는 경우에 따라서 해제 특정의 자식 저장소에 대한 필터링 출력을, 단순히 그 안에 파일 생성 .git / 정보 / 속성 과 함께,

    **. ipynb 필터 =

내용으로. 분명히 같은 방식으로 반대의 경우도 가능합니다 : 특정 저장소에 대해서만 필터링을 활성화하십시오 .

  • 코드는 이제 자체 자식 저장소에 유지됩니다

  • 위의 지침으로 인해 ImportErrors가 발생하면 스크립트 경로 앞에 "ipython"을 추가하십시오.

    git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
    

편집 : 2016 년 5 월 (2017 년 2 월 업데이트) : 내 스크립트에 대한 몇 가지 대안이 있습니다. 완전성을 위해 다음은 내가 아는 사람들의 목록입니다 .nbstripout ( 다른 변형 ), nbstrip , jq .


우리는 제품이 Jupyter Notebooks 인 공동 작업 프로젝트를 보유하고 있으며 지난 6 개월 동안 효과적으로 작동하는 접근 방식을 사용했습니다. .py파일 자동 저장을 활성화하고 파일과 .ipynb파일을 모두 추적 .py합니다.

이렇게하면 누군가 최신 노트북을 보거나 다운로드하려면 github 또는 nbviewer를 통해 할 수 있으며, 노트북 코드가 어떻게 바뀌 었는지 확인하려면 .py파일 의 변경 사항을 볼 수 있습니다.

들어 Jupyter노트북 서버 ,이 라인을 추가하여 수행 할 수 있습니다

import os
from subprocess import check_call

def post_save(model, os_path, contents_manager):
    """post-save hook for converting notebooks to .py scripts"""
    if model['type'] != 'notebook':
        return # only do this for notebooks
    d, fname = os.path.split(os_path)
    check_call(['jupyter', 'nbconvert', '--to', 'script', fname], cwd=d)

c.FileContentsManager.post_save_hook = post_save

받는 jupyter_notebook_config.py파일과 노트북 서버를 다시 시작.

jupyter_notebook_config.py파일 을 찾을 디렉토리가 확실 jupyter --config-dir하지 않으면을 입력하고 파일을 찾을 수 없으면을 입력 하여 파일을 작성할 수 있습니다 jupyter notebook --generate-config.

들어 Ipython 3노트북 서버 ,이 라인을 추가하여 수행 할 수 있습니다

import os
from subprocess import check_call

def post_save(model, os_path, contents_manager):
    """post-save hook for converting notebooks to .py scripts"""
    if model['type'] != 'notebook':
        return # only do this for notebooks
    d, fname = os.path.split(os_path)
    check_call(['ipython', 'nbconvert', '--to', 'script', fname], cwd=d)

c.FileContentsManager.post_save_hook = post_save

받는 ipython_notebook_config.py파일과 노트북 서버를 다시 시작. 이 줄은 @minrk가 제공 한 github 문제의 답변 이며 @dror는 SO 답변에도 포함합니다.

들어 Ipython 2노트북 서버 , 이것은 사용하여 서버를 시작하여 수행 할 수 있습니다 :

ipython notebook --script

또는 라인을 추가하여

c.FileNotebookManager.save_script = True

받는 ipython_notebook_config.py파일과 노트북 서버를 다시 시작.

ipython_notebook_config.py파일 을 찾을 디렉토리가 확실 ipython locate profile default하지 않으면을 입력하고 파일을 찾을 수 없으면을 입력 하여 파일을 작성할 수 있습니다 ipython profile create.

여기 이 방법을 사용 GitHub의에 대한 우리의 프로젝트는 : 여기에 A의 노트북에 최근 변경 사항을 탐험의 GitHub의 예 .

우리는 이것에 매우 만족했습니다.


나는 MinRKs gist를nbstripout 기반으로 Git과 Mercurial을 지원합니다 (mforbes에게 감사드립니다). 명령 행에서 독립형으로 사용하거나 / 를 통해 현재 저장소에 쉽게 설치 (제거) 된 필터로 사용됩니다 .nbstripout installnbstripout uninstall

에서 가져 오기 PyPI 하거나

pip install nbstripout

다음은 IPython 3.0 용 Cyrille Rossant의 새로운 솔루션으로, json 기반 ipymd 파일이 아닌 마크 다운 파일을 유지합니다.

https://github.com/rossant/ipymd


(2017-02)

전략

  • on_commit () :
    • 출력을 제거> name.ipynb ( nbstripout,)
    • 출력 제거> name.clean.ipynb ( nbstripout,)
    • 항상 nbconvert파이썬으로 : name.ipynb.py ( nbconvert)
    • 항상 markdown으로 변환 : name.ipynb.md ( nbconvert, ipymd)
  • vcs.configure () :
    • git difftool, mergetool : nbdiff의 nbdiff 및 nbmerge

도구


노트북에서 몇 년 동안 출력을 제거한 후 더 나은 솔루션을 찾으려고 노력했습니다. 이제 Jupyter Notebook과 Jupyter Lab 모두를 위해 확장 한 Jupytext를 사용 합니다.

Jupytext는 Jupyter 노트북을 다양한 텍스트 형식 (스크립트, 마크 다운 및 R 마크 다운)으로 변환 할 수 있습니다. 그리고 반대로. 또한 노트북을 이러한 형식 중 하나로 페어링 하고 노트북의 두 표현 ( 파일 .ipynb.md/.py/.R파일) 을 자동으로 동기화 하는 옵션을 제공합니다 .

Jupytext가 위의 질문에 어떻게 대답하는지 설명하겠습니다.

출력 포함 또는 제외 중에서 선택할 수 있습니다.

.md/.py/.R파일은 입력 세포가 포함되어 있습니다. 항상이 파일을 추적해야합니다. .ipynb출력을 추적하려는 경우에만 파일 버전을 지정하십시오 .

원하지 않는 경우 실수로 출력을 커밋하지 못하게합니다.

추가 *.ipynb.gitignore

로컬 버전으로 출력을 유지할 수 있습니다.

출력은 (로컬) .ipynb파일에 보존 됩니다

내 버전 제어 시스템을 사용하여 입력의 변경 사항을 볼 수 있습니다 (즉, 입력을 버전 제어 만하지 만 로컬 파일에 출력이있는 경우 입력이 변경되었는지 확인하고 싶습니다 (커밋 필요) 버전 제어 상태 명령을 사용하면 로컬 파일에 출력이 있으므로 항상 차이를 등록합니다.)

.py/.R또는 .md파일 의 차이점 은 당신이 찾고있는 것입니다.

업데이트 된 깨끗한 노트북에서 작업중인 노트북 (출력이 포함 된)을 업데이트 할 수 있습니다. (최신 정보)

최신 버전 .py/.R또는 .md파일을 가져와 Jupyter (Ctrl + R)에서 노트북을 새로 고칩니다. 파일의 출력과 일치하는 텍스트 파일에서 최신 입력 셀을 가져옵니다 .ipynb. 커널은 영향을받지 않습니다. 즉, 지역 변수가 보존됩니다. 남은 곳에서 작업을 계속할 수 있습니다.

Jupytext가 마음에 드는 점은 노트북 ( .py/.R또는 .md파일 형식 )이 선호하는 IDE에서 편집 될 수 있다는 것입니다. 이 방법을 사용하면 노트북 리팩토링이 쉬워집니다. 완료되면 Jupyter에서 노트북을 새로 고치면됩니다.

시도해보고 싶다면 Jupytext를 설치 pip install jupytext하고 Jupyter Notebook 또는 Lab 편집기를 다시 시작하십시오. 당신이 버전 제어에 원하는 노트북을 열고 페어링 사용하여 마크 다운 파일 (또는 스크립트)에 Jupytext 메뉴 Jupyter 노트북에서 (또는 Jupytext 명령 Jupyter 연구소에서 참조). 전자 필기장을 저장하면 원본 파일 .ipynb과 약속 된 전자 필기장 텍스트 표현의 두 가지 파일을 얻을 수 있으며 이는 버전 제어에 완벽하게 맞습니다!

Jupytext는 명령 줄 에서도 사용할 수 있습니다 .


마침내 Jupyter와 Git이 함께 즐겁게 연주 할 수있는 생산적이고 간단한 방법을 찾았습니다. 나는 여전히 첫 번째 단계에 있지만 이미 다른 모든 복잡한 솔루션보다 훨씬 낫다고 생각합니다.

Visual Studio Code 는 Microsoft의 멋진 오픈 소스 코드 편집기입니다. Jupyter Notebook 을 Python 코드로 가져올 수있는 뛰어난 Python 확장 기능이 있습니다.

노트북을 파이썬 파일로 가져온 후에는 모든 코드와 마크 다운이 일반적인 파이썬 파일에 함께 포함되며 주석에는 특수 마커가 있습니다. 아래 이미지에서 볼 수 있습니다.

파이썬으로 변환 된 노트북이있는 VSCode 편집기

파이썬 파일에는 노트북 입력 셀의 내용이 있습니다. 출력은 분할 창에서 생성됩니다. 노트북에 순수한 코드가 있으며 실행하는 동안 변경되지 않습니다. 코드와 혼합 된 출력이 없습니다. diff를 분석하기위한 이상한 Json의 이해할 수없는 형식은 없습니다.

모든 단일 diff를 쉽게 식별 할 수있는 순수한 파이썬 코드입니다.

.ipynb더 이상 파일 버전을 지정할 필요조차 없습니다. *.ipynb줄을 넣을 수 있습니다 .gitignore.

다른 사람과 공유하거나 공유하려면 노트북을 생성해야합니까? 문제 없습니다 . 대화 형 파이썬 창에서 내보내기 버튼클릭하십시오.

파이썬 파일을 노트북 형식으로 내보내기

나는 하루 동안 만 사용했지만 마침내 Git과 함께 Jupyter를 행복하게 사용할 수 있습니다.

추신 : VSCode 코드 완성이 Jupyter보다 훨씬 낫습니다.


에서 지적했듯이 --script에서는 더 이상 사용되지 않습니다 3.x. 이 방법은 저장 후 후크를 적용하여 사용할 수 있습니다. 특히 다음을 추가하십시오 ipython_notebook_config.py.

import os
from subprocess import check_call

def post_save(model, os_path, contents_manager):
    """post-save hook for converting notebooks to .py scripts"""
    if model['type'] != 'notebook':
        return # only do this for notebooks
    d, fname = os.path.split(os_path)
    check_call(['ipython', 'nbconvert', '--to', 'script', fname], cwd=d)

c.FileContentsManager.post_save_hook = post_save

코드는 # 8009 에서 가져옵니다 .


위의 2016 년 인기있는 답변은 2019 년에 더 나은 방법과 비교할 때 일관성이없는 해킹입니다.

몇 가지 옵션이 있으며 질문에 가장 적합한 것은 Jupytext입니다.

주피 텍스트

캐치 Jupytext의 데이터 과학을 향해 기사를

버전 제어에서 작동하는 방식은 .py 및 .ipynb 파일을 모두 버전 제어에 배치하는 것입니다. 입력 diff를 원하면 .py를보고 최신 렌더링 출력을 원하면 .ipynb를보십시오.

주목할만한 언급 : VS studio, nbconvert, nbdime, 수소

VS 스튜디오 및 / 또는 수소 (또는 유사한)가 조금 더 많은 작업 으로이 워크 플로우 솔루션의 주요 플레이어가 될 것이라고 생각합니다.


불행히도, 나는 Mercurial에 대해 많이 알지 못하지만 Git 명령을 Mercurial로 변환 할 수 있기를 희망하여 Git과 함께 사용할 수있는 솔루션을 제공 할 수 있습니다.

배경의 경우, Git에서 add명령은 파일에 대한 변경 사항을 준비 영역에 저장합니다. 이 작업을 마치면 파일을 스테이징하도록 지시하지 않는 한 파일에 대한 후속 변경 사항은 Git에서 무시됩니다. 따라서, 주어진 파일의 각각에 대한 모든 파일을 떼어 내고, 다음 스크립트, outputs그리고 prompt_number sections, 피복을 벗긴 파일을 단 한 다음 원본을 복원합니다 :

참고 : 이 명령을 실행하면과 같은 오류 메시지가 표시되면를 ImportError: No module named IPython.nbformat사용 ipython하여 대신 스크립트를 실행하십시오 python.

from IPython.nbformat import current
import io
from os import remove, rename
from shutil import copyfile
from subprocess import Popen
from sys import argv

for filename in argv[1:]:
    # Backup the current file
    backup_filename = filename + ".backup"
    copyfile(filename,backup_filename)

    try:
        # Read in the notebook
        with io.open(filename,'r',encoding='utf-8') as f:
            notebook = current.reads(f.read(),format="ipynb")

        # Strip out all of the output and prompt_number sections
        for worksheet in notebook["worksheets"]:
            for cell in worksheet["cells"]:
               cell.outputs = []
               if "prompt_number" in cell:
                    del cell["prompt_number"]

        # Write the stripped file
        with io.open(filename, 'w', encoding='utf-8') as f:
            current.write(notebook,f,format='ipynb')

        # Run git add to stage the non-output changes
        print("git add",filename)
        Popen(["git","add",filename]).wait()

    finally:
        # Restore the original file;  remove is needed in case
        # we are running in windows.
        remove(filename)
        rename(backup_filename,filename)

변경 사항을 커밋하려는 파일에서 스크립트가 실행되면 실행하십시오 git commit.


나는 매우 실용적인 접근법을 사용합니다. 여러 노트북에서 여러면에서 잘 작동합니다. 또한 노트북을 '이동'할 수도 있습니다. Windows에서 Unix / MacOS로 작동합니다.
Al은 간단하다고 생각하고 위의 문제를 해결합니다 ...

개념

기본적으로 -file을 추적 하지 말고.ipnyb 해당 .py-file 추적하십시오 .
시작으로 노트북 서버--script옵션을 해당 파일이 자동으로 노트북을 저장할 때 저장 / 생성됩니다.

이러한 파일 .py은 모든 입력을 포함합니다. 비 테두리는 셀 경계와 마찬가지로 주석에 저장됩니다. 이러한 파일을 노트북 서버로 읽거나 가져 와서 끌어서 노트북을 다시 만들 수 있습니다. 출력 만 사라졌습니다. 다시 실행될 때까지

개인적으로 나는 수은사용 하여 .py파일 을 버전 추적 합니다. 그리고 일반 (명령 줄) 명령을 사용하여 추가, 체크인 (요법)합니다. 대부분의 다른 (D) VCS가이를 허용합니다.

지금 역사를 추적하는 것은 간단합니다. .pyDIFF 작은, 텍스트 및 간단한이다. 가끔 우리는 복제본 (단지 지점, 두 번째 노트북 서버 시작) 또는 이전 버전 (체크 아웃하고 노트북 서버로 가져 오기) 등이 필요합니다.

팁 & 트릭

  • Mercurial은 * .ipynb 를 ' .hgignore '에 추가 하여 해당 파일을 무시할 수 있음을 알고 있습니다.
  • (bash) 스크립트를 작성하여 서버를 시작하고 ( --script옵션으로) 버전 추적
  • 노트북을 저장하면 .py-file 이 저장 되지만 체크인 하지는 않습니다 .
    • 이것은 단점입니다 .
    • 또한 기능 입니다. 리포지토리 기록을 클러스터링하지 않고 노트북을 저장하고 나중에 계속할 수 있습니다.

소원

  • 노트북 대시 보드에 체크인 / 추가 / 기타 버튼이 있으면 좋을 것입니다.
  • 체크 아웃 (예를 들어) file@date+rev.py도움이 될 것입니다. 추가하려면 많은 노력이 필요합니다. 어쩌면 나는 한 번 그렇게 할 것입니다. 지금까지는 손으로 만합니다.

완벽한 솔루션처럼 보이는 "jupytext"를 만나십시오. 노트북에서 .py 파일을 생성 한 다음 동기화 상태를 유지합니다. 출력을 잃지 않고 .py 파일을 통해 입력을 버전 제어, diff 및 병합 할 수 있습니다. 노트북을 열면 입력 셀에 .py를 사용하고 출력에 .ipynb를 사용합니다. 그리고 출력을 git에 포함하려면 ipynb를 추가하면됩니다.

https://github.com/mwouts/jupytext


노트북의 버전 관리를 처리하는 전략과 도구가 너무 많기 때문에 적절한 전략을 선택하기 위해 흐름도를 만들려고했습니다 (2019 년 4 월 생성)

버전 관리 전략을 선택하는 의사 결정 흐름


다음과 같이 유니 코드 구문 분석 오류가 발생하는 경우 Pietro Battiston의 우수한 스크립트를 추적하려면 다음을 수행하십시오.

Traceback (most recent call last):
  File "/Users/kwisatz/bin/ipynb_output_filter.py", line 33, in <module>
write(json_in, sys.stdout, NO_CONVERT)
  File "/Users/kwisatz/anaconda/lib/python2.7/site-packages/IPython/nbformat/__init__.py", line 161, in write
fp.write(s)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2014' in position 11549: ordinal not in range(128)

스크립트 시작 부분에 추가 할 수 있습니다.

reload(sys)
sys.setdefaultencoding('utf8')

이 문제를 해결하는 파이썬 패키지를 만들었습니다.

https://github.com/brookisme/gitnb

git repo 내부의 노트북을 추적 / 업데이트 / 차단하기위한 git-inspired 구문을 CLI에 제공합니다.

여기 예가 있습니다

# add a notebook to be tracked
gitnb add SomeNotebook.ipynb

# check the changes before commiting
gitnb diff SomeNotebook.ipynb

# commit your changes (to your git repo)
gitnb commit -am "I fixed a bug"

"gitnb commit"을 사용하는 마지막 단계는 git repo에 커밋하는 것입니다. 본질적으로 래퍼

# get the latest changes from your python notebooks
gitnb update

# commit your changes ** this time with the native git commit **
git commit -am "I fixed a bug"

몇 가지 방법이 더 있으며 각 단계에서 더 많거나 적은 사용자 입력이 필요하도록 구성 할 수 있지만 이것이 일반적인 아이디어입니다.


주위를 파고 난 후에 마침내 Jupyter docs 에서이 비교적 간단한 사전 저장 후크를 발견 했습니다 . 셀 출력 데이터를 제거합니다. jupyter_notebook_config.py파일 에 붙여 넣어야 합니다 (자세한 내용은 아래 참조).

def scrub_output_pre_save(model, **kwargs):
    """scrub output before saving notebooks"""
    # only run on notebooks
    if model['type'] != 'notebook':
        return
    # only run on nbformat v4
    if model['content']['nbformat'] != 4:
        return

    for cell in model['content']['cells']:
        if cell['cell_type'] != 'code':
            continue
        cell['outputs'] = []
        cell['execution_count'] = None
        # Added by binaryfunt:
        if 'collapsed' in cell['metadata']:
            cell['metadata'].pop('collapsed', 0)

c.FileContentsManager.pre_save_hook = scrub_output_pre_save

에서 리치 Signell의 대답 :

If you aren't sure in which directory to find your jupyter_notebook_config.py file, you can type jupyter --config-dir [into command prompt/terminal], and if you don't find the file there, you can create it by typing jupyter notebook --generate-config.


I did what Albert & Rich did - Don't version .ipynb files (as these can contain images, which gets messy). Instead, either always run ipython notebook --script or put c.FileNotebookManager.save_script = True in your config file, so that a (versionable) .py file is always created when you save your notebook.

To regenerate notebooks (after checking out a repo or switching a branch) I put the script py_file_to_notebooks.py in the directory where I store my notebooks.

Now, after checking out a repo, just run python py_file_to_notebooks.py to generate the ipynb files. After switching branch, you may have to run python py_file_to_notebooks.py -ov to overwrite the existing ipynb files.

Just to be on the safe side, it's good to also add *.ipynb to your .gitignore file.

Edit: I no longer do this because (A) you have to regenerate your notebooks from py files every time you checkout a branch and (B) there's other stuff like markdown in notebooks that you lose. I instead strip output from notebooks using a git filter. Discussion on how to do this is here.


Ok, so it looks like the current best solution, as per a discussion here, is to make a git filter to automatically strip output from ipynb files on commit.

Here's what I did to get it working (copied from that discussion):

I modified cfriedline's nbstripout file slightly to give an informative error when you can't import the latest IPython: https://github.com/petered/plato/blob/fb2f4e252f50c79768920d0e47b870a8d799e92b/notebooks/config/strip_notebook_output And added it to my repo, lets say in ./relative/path/to/strip_notebook_output

Also added the file .gitattributes file to the root of the repo, containing:

*.ipynb filter=stripoutput

And created a setup_git_filters.sh containing

git config filter.stripoutput.clean "$(git rev-parse --show-toplevel)/relative/path/to/strip_notebook_output" 
git config filter.stripoutput.smudge cat
git config filter.stripoutput.required true

And ran source setup_git_filters.sh. The fancy $(git rev-parse...) thing is to find the local path of your repo on any (Unix) machine.


This jupyter extension enables users to push jupyter notebooks directly to github.

Please look here

https://github.com/sat28/githubcommit


노트북의 출력을 유지 해야하는 아래 게시물에서 논의 된 아이디어는 어떻습니까? 노트 생성에 시간이 오래 걸릴 수 있다는 주장과 함께 GitHub는 이제 노트북을 렌더링 할 수 있기 때문에 편리합니다. .py 파일 내보내기를 위해 자동 저장 후크가 추가되어 diff 및 .html에 사용되어 노트북 또는 git을 사용하지 않는 팀 구성원과 공유합니다.

https://towardsdatascience.com/version-control-for-jupyter-notebook-3e6cef13392d

참고 URL : https://stackoverflow.com/questions/18734739/using-ipython-notebooks-under-version-control



반응형