[version-control] 버전 제어에서 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


답변

노트북에서 몇 년 동안 출력을 제거한 후 더 나은 솔루션을 찾으려고 노력했습니다. 이제 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는 명령 줄 에서도 사용할 수 있습니다 .


답변

업데이트 : 이제
Visual Studio Code에서 Jupyter Notebook 파일을 직접 편집 할 수 있습니다 . 노트북 또는 변환 된 python 파일을 편집하도록 선택할 수 있습니다.

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

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

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

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

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

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

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

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

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

노트북을 직접 편집하는 경우 이제 아이콘이 Convert and save to a python script있습니다.
Visual Studio Code의 Jupyter 아이콘

다음은 Visual Studio Code 내부의 노트북 스크린 샷입니다.

VSCode 내에서 노트북 편집

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

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


답변

(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

도구