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


569

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은따라서이 접근 방식은 제대로 연결될 수 있으면 가능할 것입니다. 그러나 각 버전 제어 시스템에 연결하는 것은 좋은 생각처럼 보이지 않습니다 (어쨌든 노트북 메커니즘에 연결해야 함).

뉴스 그룹

이슈

풀 요청


github.com/ipython/ipython에 문제로 추가 하거나이 목표를 달성하는 데 도움이되는 풀 요청을 제출하는 것이 좋습니다.
Kyle Kelley

4
출력을 제거하는 작업 스크립트가 있으면 Git "clean"필터를 사용하여 커밋하기 전에 자동으로 적용 할 수 있습니다 (clean / smudge 필터 참조).
Matthias

1
@foobarbecue이 질문에는 불만족스러운 해결 방법이 있습니다. 각 질문에는 하나 이상의 제한이 있습니다. 이제 PR 4175가 병합되었으므로 완전한 솔루션을 공식화 할 수 있지만 여전히 수행해야합니다. 내가 시간을 갖 자마자 다른 사람이 그 동안 만족스러운 해결책을 제공하지 않으면 (답으로) 할 것입니다.
mforbes

1
@ saroele 아직 권장되는 해결책을 찾지 못했습니다 : --script옵션 과 함께 가려고 했지만 제거되었습니다. 저장 후 후크가 구현 될 때까지 ( 계획된 ) 몇 가지 기술을 결합하여 수용 가능한 솔루션을 제공 할 수있을 것으로 예상됩니다.
mforbes

1
@mforbes PR은 귀하의 의견 후 며칠 동안 병합 된 것 같습니다. 새 기능을 사용하는 방법을 보여주는 답변을 여기에 게시 할 수 있습니까?
KobeJohn

답변:


124

다음은 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 .


2
가져온 변경 사항을 통합하는 문제를 어떻게 처리합니까? 모든 출력물을 재생성해야합니까? (나는 이것이 두 번째 한계의 징후라고 생각한다.)
mforbes

1
@zhermes이 확장 버전 확인을해야한다
피에트로 Battiston

1
이 git filters 방법을 외부 diff 도구와 함께 사용하는 방법이 있습니까? 필터를 일반 명령 줄 도구를 사용하면 적용되지만 meld를 diff 도구로 사용하는 경우에는 적용되지 않습니다. stackoverflow.com/q/30329615/578770
FA

1
ImportErroripython을 사용하여 위의 내용을 변경 하지 않으려면 :git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
chris838

1
1) 나는 반대로 REPO의 루트에 .gitattributes에서 필터를 선언 선호 : 내 경우에는 스크립트를 사용할 때 가장 최고 솔루션 피에트로, 감사합니다 :) 나는이 일을 변경 ~/.gitattributesI 2처럼, 일, 다른 사람이 같은 필터가 ) 나는 정규 표현식을로 정의하고 workdir/**/*.ipynb filter=dropoutput_ipynb출력으로 노트북을 푸시하고 github에서 북마크 가능한 렌더링을 즐기고 싶다면 대부분의 노트북을 workdir / =>에 넣습니다.
Svend

63

우리는 제품이 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의 예 .

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


1
사용 --script이 실제로 작동 했다는 추가 증거에 감사드립니다 . 이 문제는 이미지를 보관하면 실제 노트북이 클 수 있다는 것입니다. 이 방법으로 이상적인 솔루션 은 최신 전체 노트북 만 추적하기 위해 git-annex 와 같은 것을 사용할 수 있습니다 .
mforbes

Ipython 3.x에서는 --script더 이상 사용되지 않습니다. ipython.org/ipython-doc/3/whatsnew/version3.html
Dror

@ dror에게 감사드립니다. 여기에서 제공 한 것처럼 minrk의 ipython 3.x 솔루션을 제공하도록 답변을 업데이트했습니다.
Rich Signell

10
업데이트 : 이 솔루션은 iPython의 Jupyter의 "The Big Split"으로 인해 iPython 버전 4에서 중단되었습니다. 이 솔루션을 버전 4로 조정하려면 명령 jupyter notebook --generate-config을 사용하여 구성 파일을 작성하십시오. 이 명령 jupyter --config-dir은 구성 파일이 들어있는 디렉토리를 찾습니다. @Rich가 제공 한 코드 스 니펫은라는 파일에 추가해야합니다 jupyter_notebook_config.py. 나머지는 이전과 같이 작동합니다.
mobius 교 자식

2
@mobiusdumpling로 점뿐만 아니라, 교체 check_call(['ipython'로를 check_call(['jupyter', 그렇지 않으면 당신은 경고를 얻을 것이다 ipython nbconvert되지 않습니다 그리고 당신은 사용해야합니다 jupyter nbconvert대신. (Jupyter v4.1.0, iPython v4.1.2)
cutculus

36

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

에서 가져 오기 PyPI 하거나

pip install nbstripout

위에서 설명한 포스트 저장 후크를 사용하여 .ipynb와 해당 .py를 자동으로 생성하는 워크 플로우를 고려하고 있습니다. diffs에 .py를 사용하고 싶습니다-nbstripout이 셀 실행 카운터에서 .py 파일을 지울 수 있습니까 (# In [1]이 In [*]로 변경됨) diff를 어지럽히 지 않아야합니다. 이를위한 간단한 스크립트를 작성 하시겠습니까?
Krzysztof Słowiński

1
@ KrzysztofSłowiński 아니요, nbstripout노트북의 JSON 형식을 사용 하므로이 사용 사례를 쉽게 지원하지 않습니다. 사용 사례에 특화된 스크립트를 작성하는 것이 좋습니다.
kynan


13

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


13

업데이트 : 이제 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보다 훨씬 낫습니다.


12

(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

도구


11

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

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

주피 텍스트

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

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

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

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


9

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

https://github.com/mwouts/jupytext


9

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

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


8

에서 지적했듯이 --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 에서 가져옵니다 .


저장 후 후크 사용을 시연 해 주셔서 감사합니다. 불행히도, 앞에서 언급했듯이 .py파일에서 노트북으로 다시 가져 오는 것은 문제가되므로 불행히도 완전한 솔루션은 아닙니다. ( .py노트북 대신 파일 을 비교하는 것이 매우 좋았기를 바랍니다 . 아마도 새로운 노트북 diff 기능이 유용 할 것입니다.
mforbes

1
감사! --script버전 제어에 관계없이이 트릭을 사용하여 동작 을 재현하고 있습니다. 처음에는 몇 가지 문제가 있었으므로 누군가를 시간을 절약 할 수있는 경우를 대비하여 : 1) ipython_notebook_config.py프로필 폴더에서이 폴더가 누락 된 경우 ipython profile create생성하여 실행 하십시오. 2) 저장 후 후크가 무시되는 것처럼 보이는 경우 ipython을 실행 --debug하여 문제점을 진단하십시오. 3) 스크립트가 오류 ImportError: No module named mistune-간단한 설치 minstue 와 함께 실패하는 경우 : pip install mistune.
Joe

7

불행히도, 나는 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.


제안 해 주셔서 감사합니다. Mercurial에는 실제로 git과 같은 준비 영역이 없습니다 ( 그러나이 목적으로 수은 대기열 을 사용할 수는 있음 ). 그동안 .clean확장 버전으로 깨끗한 버전을 저장하는 저장 후크 에이 코드를 추가하려고했습니다 . 불행히도, IPython직접 수정 하지 않고서는이 작업을 수행하는 방법을 알 수 없었습니다 (이 변경은 매우 간단합니다). 나는 이것을 잠시 동안 가지고 노는 것이 그것이 나의 모든 요구에 맞는지 알아볼 것이다.
mforbes

6

나는 매우 실용적인 접근법을 사용합니다. 여러 노트북에서 여러면에서 잘 작동합니다. 또한 노트북을 '이동'할 수도 있습니다. 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도움이 될 것입니다. 추가하려면 많은 노력이 필요합니다. 어쩌면 내가 한 번 할 것입니다. 지금까지는 손으로 만합니다.

어떻게에서 가야합니까 .py노트북에 파일을 다시? 나는이 접근법을 좋아하지만 .ipynb-> .py-> .ipynb는 잠재적으로 손실이 있기 때문에 이것을 심각하게 고려하지 않았습니다.
mforbes

예를 들어, 전자 필기장 대시 보드에 놓으면로드 할 수 있습니다. "출력 데이터"를 제외하고 아무것도 손실되지 않습니다
Albert

그것이 사실이라면, 나는 이것이 아이디어에 가깝다고 생각하지만, IPython은 데이터 .py.ipynb형식으로 전환하는 데있어 데이터를 완전히 보존하겠다는 약속을하지 않았다고 생각합니다 . 이에 대한 문제가 있으므로 아마도 완전한 솔루션의 기초가 될 것입니다.
mforbes

.py파일 에서 파일로 변환하는 데 어려움 이 .ipynb있습니다. nbconvert아직이 기능을 지원하지 않는 것 같습니다 ipython notebook. 수동으로 실행 한 후 노트북 대시 보드가 없습니다 . 이 역변환을 구현하는 방법에 대한 일반적인 제안이 있습니까?
mforbes

분명히 .py노트북 간 변환은 왕복 여행용이 아닙니다. 따라서 이것이 일반적인 해결책이 될 수는 없지만 효과가 있습니다.
holdenweb

3

다음과 같이 유니 코드 구문 분석 오류가 발생하는 경우 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')

3

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

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"

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


3

주위를 파고 난 후에 마침내 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의 대답 :

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


1
이 솔루션은 출력을 디스크에 저장 하지 않으며 버전 제어 문제와는 다소 독립적입니다.
bdforbes

2

Albert & Rich가 한 일을했습니다. .ipynb 파일을 버전 화하지 마십시오 (이 파일에는 이미지가 포함될 수 있으므로 지저분합니다). 대신, 항상 구성 파일을 실행 ipython notebook --script하거나 배치 하여 노트북을 저장할 때 항상 c.FileNotebookManager.save_script = True(버전 화 가능) .py파일이 작성되도록하십시오.

노트북을 재생성하려면 (레포를 체크 아웃하거나 지점을 전환 한 후) 필자는 노트북을 저장하는 디렉토리에 py_file_to_notebooks.py 스크립트를 습니다.

이제 repo를 체크 아웃 한 후 python py_file_to_notebooks.pyipynb 파일을 생성하기 위해 실행 하십시오. 분기를 전환 한 후 python py_file_to_notebooks.py -ov기존 ipynb 파일을 덮어 쓰기 위해 실행해야 할 수도 있습니다 .

안전 *.ipynb을 위해 .gitignore파일에 추가 하는 것도 좋습니다 .

편집 : 나는 (A) 지점을 체크 아웃 할 때마다 py 파일에서 노트북을 재생성해야하고 (B) 잃어버린 노트북에 마크 다운과 같은 다른 것들이 있기 때문에 더 이상 이것을하지 않습니다. 대신 git 필터를 사용하여 노트북의 출력을 제거합니다. 이 작업을 수행하는 방법에 대한 토론은 여기에 있습니다 .


이 아이디어가 마음에 들었지만 테스트 후 .py파일을 다시 변환 하는 .ipynb데 문제가 있음을 발견했습니다. 특히 아직 변환기가없는 버전 4 노트북에서는 문제가 있습니다. 현재 v3 임포터를 사용하고 v4로 변환해야 하며이 복잡한 여행에 대해 약간 걱정하고 있습니다. 또한 .py노트북이 주로 Julia 코드 인 경우 파일이 적합하지 않습니다! 마지막으로, --script더 이상 사용되지 않으므로 후크가 갈 길이라고 생각합니다.
mforbes

링크의 git 필터 솔루션은 훌륭합니다. 여기에서 답을 복사해야합니다 :-)
mcarans

2

자, 여기 에서 논의 된 것처럼 현재 최고의 솔루션처럼 보입니다 .git 필터를 만들어 커밋시 ipynb 파일의 출력을 자동으로 제거하는 것입니다.

작동하도록하기 위해 수행 한 작업은 다음과 같습니다 (해당 토론에서 복사).

: 나는 당신이 최신 IPython 가져올 수 없습니다 때 정보 오류를주고 약간 cfriedline의 nbstripout 파일을 수정 https://github.com/petered/plato/blob/fb2f4e252f50c79768920d0e47b870a8d799e92b/notebooks/config/strip_notebook_output을 할 수 있습니다, 그리고 내 REPO에 추가 말하다./relative/path/to/strip_notebook_output

또한 다음을 포함하는 .gitattributes 파일을 리포지토리의 루트에 추가했습니다.

*.ipynb filter=stripoutput

그리고 setup_git_filters.sh포함하는

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

그리고 달렸다 source setup_git_filters.sh. 멋진 $ (git rev-parse ...) 것은 (Unix) 머신에서 리포지토리의 로컬 경로를 찾는 것입니다.


1

이 jupyter 확장을 통해 사용자는 jupyter 노트북을 github으로 직접 푸시 할 수 있습니다.

여기를 봐주세요

https://github.com/sat28/githubcommit


이것이 무엇을 설명 할 수 있습니까? 증량은 특히 명확하지 않습니다.
Alex Monras

이것은 바로 당신이 커밋 메시지와 GitHub의에 REPO에 노트북을 밀어 수있는 곳에서 jupyter 노트북에 버튼을 추가합니다 @AlexMonras

1

이것은 4 월 -2020 년이며 Jupyter 노트북 버전 관리를위한 많은 전략과 도구가 있습니다. 사용할 수있는 모든 도구에 대한 간단한 개요는 다음과 같습니다.

  • nbdime- 노트북의 로컬 확산 및 병합에 적합

  • nbstripout- 커밋 전에 노트북 출력을 자동으로 제거하는 git 필터

  • jupytext- 각 노트북에 .py 컴패니언 파일 동기화를 유지합니다. .py 파일 만 커밋

  • nbconvert- 전자 필기장을 파이썬 스크립트 또는 HTML (또는 둘 다)로 변환하고 이러한 대체 파일 형식을 커밋

  • ReviewNB -GitHub의 커밋 또는 풀 요청에 대한 노트북 diff (출력과 함께)를 표시합니다. 노트북 셀에 주석을 작성하여 변경 사항을 논의 할 수도 있습니다 (아래 스크린 샷).

여기에 이미지 설명을 입력하십시오

면책 조항 : ReviewNB를 작성했습니다.


0

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

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

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