Jaka jest dobra strategia utrzymywania notebooków IPython pod kontrolą wersji?
Format notebooka jest całkiem podatny na kontrolę wersji: jeśli ktoś chce kontrolować wersję notebooka i wyjść, działa to całkiem dobrze. Drażliwość pojawia się, gdy chce się tylko kontrolować wersję danych wejściowych, wyłączając wyjścia komórek (inaczej „produkty do budowania”), które mogą być dużymi binarnymi plamami, szczególnie dla filmów i fabuł. W szczególności staram się znaleźć dobry przepływ pracy, który:
- pozwala mi wybierać między włączeniem lub wyłączeniem danych wyjściowych,
- zapobiega przypadkowemu uruchomieniu wyjścia, jeśli go nie chcę,
- pozwala mi zachować dane wyjściowe w mojej lokalnej wersji,
- pozwala mi zobaczyć, kiedy mam zmiany danych wejściowych za pomocą mojego systemu kontroli wersji (tj. jeśli tylko kontroluję wersję danych wejściowych, ale mój plik lokalny ma dane wyjściowe, to chciałbym móc zobaczyć, czy dane wejściowe uległy zmianie (wymaga zatwierdzenia Użycie polecenia statusu kontroli wersji zawsze rejestruje różnicę, ponieważ plik lokalny ma dane wyjściowe.)
- pozwala mi aktualizować mój działający notatnik (który zawiera dane wyjściowe) z zaktualizowanego czystego notatnika. (aktualizacja)
Jak wspomniano, jeśli zdecyduję się na dołączenie wyjść (co jest pożądane, na przykład przy użyciu nbviewer ), wtedy wszystko będzie dobrze. Problem polega na tym, że nie chcę kontrolować wersji danych wyjściowych. Istnieją narzędzia i skrypty do usuwania danych wyjściowych z notatnika, ale często napotykam następujące problemy:
- Przypadkowo zatwierdzam wersję z wyjściem, zanieczyszczając w ten sposób moje repozytorium.
- Wyczyszczam dane wyjściowe, aby użyć kontroli wersji, ale tak naprawdę wolałbym zachować dane wyjściowe w mojej lokalnej kopii (czasami na przykład odtworzenie zajmuje trochę czasu).
- Niektóre skrypty usuwające dane wyjściowe nieznacznie zmieniają format w porównaniu z
Cell/All Output/Clear
opcją menu, tworząc w ten sposób niepożądany szum w różnicach. Rozwiązują to niektóre odpowiedzi. - Wyciągając zmiany do czystej wersji pliku, muszę znaleźć sposób na wprowadzenie tych zmian do mojego roboczego notebooka bez konieczności ponownego uruchamiania wszystkiego. (aktualizacja)
Rozważyłem kilka opcji, które omówię poniżej, ale jeszcze nie znalazłem dobrego kompleksowego rozwiązania. Pełne rozwiązanie może wymagać pewnych zmian w IPython lub może polegać na prostych skryptach zewnętrznych. Obecnie używam rtęci , ale chciałbym rozwiązania, które również działa z git : idealnym rozwiązaniem byłoby agnostyk kontroli wersji.
Zagadnienie to było omawiane wiele razy, ale nie ma ostatecznego ani jasnego rozwiązania z perspektywy użytkownika. Odpowiedź na to pytanie powinna stanowić ostateczną strategię. Jest w porządku, jeśli wymaga najnowszej (nawet programistycznej) wersji IPython lub łatwo instalowanego rozszerzenia.
Aktualizacja: gram z moją zmodyfikowaną wersją notebooka, która opcjonalnie zapisuje .clean
wersję przy każdym zapisie, korzystając z sugestii Gregory Crosswhite . Spełnia to większość moich ograniczeń, ale pozostawia następujące nierozwiązane:
- Nie jest to jeszcze standardowe rozwiązanie (wymaga modyfikacji źródła ipython. Czy istnieje sposób na osiągnięcie tego zachowania za pomocą prostego rozszerzenia? Potrzebuje pewnego rodzaju zaczepu przy zapisie.
- Problemem z bieżącym przepływem pracy jest pobieranie zmian. Będą one wchodzić do
.clean
pliku, a następnie muszą być jakoś zintegrowane z moją działającą wersją. (Oczywiście zawsze mogę ponownie uruchomić notatnik, ale może to być uciążliwe, szczególnie jeśli niektóre wyniki zależą od długich obliczeń, obliczeń równoległych itp.) Nie mam jeszcze pojęcia, jak rozwiązać ten problem . Być może przepływ pracy z rozszerzeniem takim jak ipycache może działać, ale wydaje się to trochę zbyt skomplikowane.
Notatki
Usuwanie (usuwanie) danych wyjściowych
- Gdy notebook jest uruchomiony, można użyć
Cell/All Output/Clear
opcji menu do usunięcia danych wyjściowych. - Istnieją skrypty do usuwania danych wyjściowych, takie jak skrypt nbstripout.py, które usuwają dane wyjściowe, ale nie generują takich samych danych wyjściowych, jak przy użyciu interfejsu notebooka. Zostało to ostatecznie uwzględnione w repozytorium ipython / nbconvert , ale zostało to zamknięte, stwierdzając, że zmiany są teraz zawarte w ipython / ipython , ale odpowiednia funkcjonalność wydaje się, że nie została jeszcze uwzględniona. (aktualizacja) To powiedziawszy, rozwiązanie Gregory Crosswhite pokazuje, że jest to dość łatwe, nawet bez wywoływania ipython / nbconvert, więc to podejście jest prawdopodobnie wykonalne, jeśli można je właściwie podłączyć. (Dołączenie go do każdego systemu kontroli wersji nie wydaje się jednak dobrym pomysłem - powinno to jakoś podłączyć się do mechanizmu notebooka).
Grupy dyskusyjne
Problemy
- 977: Żądania funkcji notebooka (otwarte) .
- 1280: Wyczyść wszystko po zapisaniu (Otwórz) . (Wynika z tej dyskusji .)
- 3295: automatycznie eksportowane notebooki: eksportuj tylko wyraźnie zaznaczone komórki (zamknięte) . Rozwiązane przez rozszerzenie 11 Dodaj magię zapisu i wykonania (Połączone) .
Wyciągnij wnioski
- 1621: wyczyść W [] numery zachęty na „Wyczyść wszystkie dane wyjściowe” (Scalone) . (Zobacz także 2519 (Scalony) .)
- 1563: ulepszenia clear_output (Scalone) .
- 3065: diff -ability of notebooks (Closed) .
- 3291: Dodaj opcję pomijania komórek wyjściowych podczas zapisywania. (Zamknięty) . Wydaje się to niezwykle istotne, jednak zostało zamknięte z sugestią użycia filtra „czyszczenie / rozmazywanie”. Odpowiednie pytanie, czego możesz użyć, jeśli chcesz usunąć dane wyjściowe przed uruchomieniem git diff? wydaje się, że nie otrzymano odpowiedzi.
- 3312: WIP: Haki do zapisywania w notatniku (zamknięte) .
- 3747: ipynb -> transformator ipynb (zamknięty) . Jest to oparte na 4175 .
- 4175: nbconvert: Baza eksporterów Jinjaless (Scalona) .
- 142: Użyj STDIN w nbstripout, jeśli nie podano danych wejściowych (Otwórz) .
źródło
--script
opcję, ale została ona usunięta. Czekam na wdrożenie (po planowaniu ) haczyków po zapisaniu, w którym momencie myślę, że będę w stanie zapewnić akceptowalne rozwiązanie łączące kilka technik.Odpowiedzi:
Oto moje rozwiązanie z git. Pozwala na zwykłe dodawanie i zatwierdzanie (i różnicowanie) w zwykły sposób: te operacje nie zmienią twojego drzewa roboczego, a jednocześnie (ponowne) uruchomienie notebooka nie zmieni twojej historii git.
Chociaż można to prawdopodobnie zaadaptować do innych VCS, wiem, że nie spełnia twoich wymagań (przynajmniej agnostyczność VSC). Mimo to jest dla mnie idealny i chociaż nie jest to nic szczególnie błyskotliwego, a wiele osób prawdopodobnie już go używa, nie znalazłem jasnych instrukcji, jak go wdrożyć, przeglądając go w Internecie. Może to być przydatne dla innych ludzi.
~/bin/ipynb_output_filter.py
)chmod +x ~/bin/ipynb_output_filter.py
)Utwórz plik
~/.gitattributes
o następującej treściUruchom następujące polecenia:
Gotowy!
Ograniczenia:
somebranch
i robisz togit checkout otherbranch; git checkout somebranch
, zwykle oczekujesz, że działające drzewo pozostanie niezmienione. Zamiast tego utracisz dane wyjściowe i numerację komórek w notesach, których źródło różni się między dwiema gałęziami.git commit notebook_file.ipynb
, chociaż przynajmniej utrzymałoby sięgit diff notebook_file.ipynb
wolne od śmieci base64).Moje rozwiązanie odzwierciedla fakt, że osobiście nie lubię utrzymywać wersji wygenerowanych plików - zauważ, że wykonywanie połączeń z danymi wyjściowymi jest prawie gwarantowane, aby unieważnić dane wyjściowe lub wydajność lub jedno i drugie.
EDYTOWAĆ:
jeśli zastosujesz rozwiązanie tak, jak to zasugerowałem - to znaczy globalnie - będziesz miał kłopoty na wypadek, gdyby jakieś repozytorium git chciało zaktualizować dane wyjściowe. Więc jeśli chcesz wyłączyć filtrowanie danych wyjściowych dla określonego repozytorium git, po prostu stwórz w nim plik .git / info / attribute , z
**. Filtr ipynb =
jako treść. Oczywiście w ten sam sposób można zrobić odwrotnie: włącz filtrowanie tylko dla określonego repozytorium.
kod jest teraz utrzymywany we własnym repozytorium git
jeśli powyższe instrukcje prowadzą do ImportErrors, spróbuj dodać „ipython” przed ścieżką skryptu:
EDYCJA : maj 2016 (zaktualizowany luty 2017): istnieje kilka alternatyw dla mojego skryptu - dla kompletności, oto lista tych, które znam: nbstripout ( inne warianty ), nbstrip , jq .
źródło
ImportError
, musiałem zmienić powyższe, aby uruchomić za pomocą ipython:git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
~/.gitattributes
innych osób, które mają takie same filtry jak ja 2 ) Zdefiniowałemworkdir/**/*.ipynb filter=dropoutput_ipynb
wyrażenie regularne jako i umieszczam większość moich notatników w workdir / => jeśli nadal chcę wypchnąć notebook z wyjściem i cieszyć się imponującym renderowaniem w github, po prostu umieszczam go poza tym folderem.Mamy wspólny projekt, w którym produktem są notesy Jupyter, i stosujemy podejście od sześciu miesięcy, które działa świetnie: aktywujemy zapisywanie
.py
plików automatycznie i śledzimy zarówno.ipynb
pliki, jak i.py
pliki.W ten sposób, jeśli ktoś chce wyświetlić / pobrać najnowszy notatnik, może to zrobić za pomocą github lub nbviewer, a jeśli ktoś chce zobaczyć, jak zmienił się kod notatnika, może po prostu spojrzeć na zmiany w
.py
plikach.W przypadku
Jupyter
serwerów notebooków można to osiągnąć przez dodanie wierszydo
jupyter_notebook_config.py
pliku i restartowanie serwera notebooka.Jeśli nie masz pewności, w którym katalogu znaleźć
jupyter_notebook_config.py
plik, możesz wpisaćjupyter --config-dir
, a jeśli go nie znajdziesz, możesz go utworzyć, piszącjupyter notebook --generate-config
.W przypadku
Ipython 3
serwerów notebooków można to osiągnąć przez dodanie wierszydo
ipython_notebook_config.py
pliku i restartowanie serwera notebooka. Te wiersze pochodzą od dostarczonych przez gituba problemów z odpowiedzią @minrk, a @dror również je zamieszcza w swojej odpowiedzi SO.W przypadku
Ipython 2
serwerów notebooków można to zrobić, uruchamiając serwer za pomocą:lub dodając linię
do
ipython_notebook_config.py
pliku i restartowanie serwera notebooka.Jeśli nie masz pewności, w którym katalogu znaleźć
ipython_notebook_config.py
plik, możesz wpisaćipython locate profile default
, a jeśli go nie znajdziesz, możesz go utworzyć, piszącipython profile create
.Oto nasz projekt dotyczący github, który wykorzystuje to podejście : i oto przykład github dotyczący odkrywania ostatnich zmian w notatniku .
Jesteśmy z tego bardzo zadowoleni.
źródło
--script
działało w praktyce. Problem polega na tym, że faktyczne notebooki mogą być ogromne, jeśli przechowywane są obrazy. Idealnym rozwiązaniem na tej drodze może być coś takiego jak git-annex, aby śledzić tylko najnowszy pełny notebook.--script
jest przestarzały. ipython.org/ipython-doc/3/whatsnew/version3.htmljupyter notebook --generate-config
aby utworzyć plik konfiguracyjny. Poleceniejupyter --config-dir
sprawdza, który katalog zawiera pliki konfiguracyjne. Fragment kodu podany przez @Rich powinien zostać dodany do pliku o nazwiejupyter_notebook_config.py
. Reszta działa jak poprzednio.check_call(['ipython'
sięcheck_call(['jupyter'
, inaczej otrzymasz ostrzeżenie, żeipython nbconvert
jest nieaktualna i należy użyćjupyter nbconvert
zamiast. (Jupyter v4.1.0, iPython v4.1.2)Stworzyłem
nbstripout
, w oparciu o gist MinRK , który obsługuje zarówno Git, jak i Mercurial (dzięki mforbes). Jest przeznaczony do użycia jako samodzielny w wierszu poleceń lub jako filtr, który można łatwo (nie) zainstalować w bieżącym repozytorium przeznbstripout install
/nbstripout uninstall
.Zdobądź go z PyPI lub po prostu
źródło
nbstripout
nie obsługuje łatwo tego przypadku użycia, ponieważ opiera się on na formacie JSON notatnika. Prawdopodobnie lepiej jest napisać skrypt specjalizujący się w twoim przypadku użycia.Oto nowe rozwiązanie od Cyrille Rossant dla IPython 3.0, które utrzymuje pliki znaczników zamiast plików ipymd opartych na Json:
https://github.com/rossant/ipymd
źródło
Po kilku latach usuwania danych wyjściowych w notebookach próbowałem znaleźć lepsze rozwiązanie. Teraz używam Jupytext , rozszerzenia zarówno dla Jupyter Notebook, jak i Jupyter Lab, które zaprojektowałem.
Jupytext może konwertować notesy Jupyter na różne formaty tekstowe (Skrypty, Markdown i R Markdown). I odwrotnie. Oferuje również opcję sparowania notebooka z jednym z tych formatów i automatycznej synchronizacji dwóch reprezentacji notebooka (an
.ipynb
i.md/.py/.R
pliku).Pozwól mi wyjaśnić, w jaki sposób Jupytext odpowiada na powyższe pytania:
.md/.py/.R
Plik zawiera tylko komórki wejściowych. Zawsze powinieneś śledzić ten plik. Wersja.ipynb
pliku tylko, jeśli chcesz śledzić wyniki.Dodaj
*.ipynb
do.gitignore
Dane wyjściowe są przechowywane w
.ipynb
pliku (lokalnym)Różnica w pliku
.py/.R
lub.md
jest tym, czego szukaszPobierz najnowszą wersję pliku
.py/.R
lub.md
i odśwież swój notatnik w Jupyter (Ctrl + R). Otrzymasz najnowsze komórki wejściowe z pliku tekstowego, z pasującymi danymi wyjściowymi z.ipynb
pliku. Nie ma to wpływu na jądro, co oznacza, że zmienne lokalne są zachowane - możesz kontynuować pracę tam, gdzie ją zostawiłeś.W Jupytext uwielbiam to, że notatnik (w postaci pliku
.py/.R
lub.md
) można edytować w swoim ulubionym środowisku IDE. Dzięki takiemu podejściu refaktoryzacja notebooka staje się łatwa. Po zakończeniu wystarczy odświeżyć notatnik w Jupyter.Jeśli chcesz spróbować: zainstaluj Jupytext za pomocą
pip install jupytext
i uruchom ponownie edytor Jupyter Notebook lub Lab. Otwórz notatnik, który chcesz kontrolować wersję, i sparuj go z plikiem Markdown (lub skryptem) za pomocą menu Jupytext w notatniku Jupyter (lub poleceń Jupytext w Jupyter Lab). Zapisz swój notatnik, a otrzymasz dwa pliki: oryginał.ipynb
oraz obiecaną reprezentację tekstową notatnika, co idealnie pasuje do kontroli wersji!Dla zainteresowanych: Jupytext jest także dostępny w linii poleceń .
źródło
W końcu znalazłem produktywny i prosty sposób, aby Jupyter i Git dobrze się ze sobą bawili. Wciąż jestem w pierwszych krokach, ale już myślę, że jest o wiele lepszy niż wszystkie inne skomplikowane rozwiązania.
Visual Studio Code to fajny i otwarty edytor kodu firmy Microsoft. Ma doskonałe rozszerzenie Python, które pozwala teraz importować Notatnik Jupyter jako kod Pythona. Teraz możesz także bezpośrednio edytować notesy Jupyter .
Po zaimportowaniu notebooka do pliku python cały kod i znaczniki będą razem w zwykłym pliku python ze specjalnymi znacznikami w komentarzach. Możesz zobaczyć na obrazku poniżej:
Twój plik python ma po prostu zawartość komórek wejściowych notebooka. Dane wyjściowe zostaną wygenerowane w podzielonym oknie. Masz czysty kod w notatniku, nie zmienia się on podczas jego wykonywania. Brak mieszanego wyniku z kodem. Żaden dziwny niezrozumiały format JSON do analizy twoich różnic.
Po prostu czysty kod Pythona, w którym można łatwo zidentyfikować każdą różnicę.
Nie muszę już nawet aktualizować swoich
.ipynb
plików. Mogę wstawić*.ipynb
linię.gitignore
.Chcesz wygenerować notatnik, aby go opublikować lub udostępnić komuś? Nie ma problemu, wystarczy kliknąć przycisk eksportu w interaktywnym oknie pythona
Jeśli edytujesz notatnik bezpośrednio, teraz jest ikona
Convert and save to a python script
.Oto zrzut ekranu notebooka w programie Visual Studio Code:
Używam go tylko przez jeden dzień, ale w końcu mogę z radością korzystać z Jupyter z Git.
PS: Uzupełnianie kodu VSCode jest o wiele lepsze niż Jupyter.
źródło
(2017-02)
strategie
nbstripout
,)nbstripout
,)nbconvert
python: name.ipynb.py (nbconvert
)nbconvert
,ipymd
)przybory
nbstripout
: usuń dane wyjściowe z notebookapip install nbstripout; nbstripout install
ipynb_output_filter
: usuń dane wyjściowe z notebookaipymd
: konwersja między {Jupyter, Markdown, O'Reilly Atlas Markdown, OpenDocument, .py}nbdime
: „Narzędzia do różnicowania i łączenia notatników Jupyter”. (2015)nbdiff
: porównaj notebooki w sposób przyjazny terminalowinbmerge
: trójstronne połączenie notebooków z automatycznym rozwiązywaniem konfliktównbdiff-web
: pokazuje bogaty renderowany diff zeszytównbmerge-web
: udostępnia internetowe narzędzie do łączenia w trzy strony dla notebookównbshow
: zaprezentuj pojedynczy notebook w sposób przyjazny dla terminaliźródło
Bardzo popularne powyższe odpowiedzi na 2016 rok to niespójne hacki w porównaniu z lepszym sposobem na zrobienie tego w 2019 roku.
Istnieje kilka opcji, najlepsza odpowiedź na pytanie to Jupytext.
Jupytext
Złapać Ku Data Science artykuł na Jupytext
Działa z kontrolą wersji w taki sposób, że umieszczasz zarówno pliki .py, jak i .ipynb w kontroli wersji. Spójrz na plik .py, jeśli chcesz różnicę wejściową, spójrz na plik .ipynb, jeśli chcesz mieć ostatni renderowany wynik.
Godne uwagi wspomnienia: VS studio, nbconvert, nbdime, wodór
Myślę, że przy odrobinie pracy, VS studio i / lub wodór (lub podobny) staną się dominującymi graczami w rozwiązaniu tego przepływu pracy.
źródło
Wystarczy natknąć się na „jupytext”, który wygląda jak idealne rozwiązanie. Generuje plik .py z notebooka, a następnie synchronizuje oba pliki. Możesz kontrolować wersję, różnicować i scalać dane wejściowe za pomocą pliku .py bez utraty danych wyjściowych. Po otwarciu notesu używa .py dla komórek wejściowych i .ipynb dla danych wyjściowych. A jeśli chcesz dołączyć dane wyjściowe do git, możesz po prostu dodać ipynb.
https://github.com/mwouts/jupytext
źródło
Ponieważ istnieje tak wiele strategii i narzędzi do obsługi kontroli wersji dla notebooków, próbowałem utworzyć schemat blokowy, aby wybrać odpowiednią strategię (utworzono w kwietniu 2019 r.)
źródło
Jak wskazano,
--script
jest przestarzałe w3.x
. Tego podejścia można użyć, stosując hak po zapisaniu. W szczególności dodaj następujące elementy doipython_notebook_config.py
:Kod pochodzi z numeru # 8009 .
źródło
.py
pliku do notebooka jest problematyczny, więc nie jest to niestety kompletne rozwiązanie. (Chciałbym, żeby było tak, ponieważ bardzo fajnie jest różnicować.py
pliki zamiast notebooków. Być może nowa funkcja różnicowania notebooków będzie przydatna.--script
zachowania, niezależnie od kontroli wersji. Na początku miałem pewne problemy, więc na wszelki wypadek mogę komuś zaoszczędzić trochę czasu: 1) Jeśliipython_notebook_config.py
brakuje w folderze profilu, uruchom go,ipython profile create
aby go wygenerować. 2) Jeśli wydaje się, że hak po zapisaniu jest ignorowany, uruchom ipython z,--debug
aby zdiagnozować problem. 3) Jeśli skrypt nie powiedzie się z powodu błęduImportError: No module named mistune
- prosta instalacja minstue:pip install mistune
.Niestety, niewiele wiem o Mercurial, ale mogę dać ci możliwe rozwiązanie, które działa z Git, w nadziei, że możesz być w stanie przetłumaczyć moje polecenia Git na ich odpowiedniki Mercurial.
W tle w Git
add
polecenie przechowuje zmiany wprowadzone w pliku w obszarze przejściowym. Gdy to zrobisz, wszelkie późniejsze zmiany w pliku są ignorowane przez Git, chyba że powiesz mu, aby je również wystawił. W związku z tym następujący skrypt, który dla każdego z podanych plików usuwa wszystkieoutputs
iprompt_number sections
ustawia etap usuwania pliku, a następnie przywraca oryginał:UWAGA: Jeśli po uruchomieniu pojawi się komunikat o błędzie
ImportError: No module named IPython.nbformat
, użyj przycisku,ipython
aby uruchomić skrypt zamiastpython
.Po uruchomieniu skryptu na plikach, których zmiany chcesz zatwierdzić, po prostu uruchom
git commit
.źródło
.clean
rozszerzeniem. Niestety nie widziałem, jak to zrobić bez bezpośredniej modyfikacji IPython (chociaż ta zmiana była dość trywialna). Będę się z tym bawić przez chwilę i sprawdzę, czy odpowiada to wszystkim moim potrzebom.Używam bardzo pragmatycznego podejścia; które działają dobrze dla kilku notebooków, z kilku stron. Pozwala mi nawet „przenosić” zeszyty. Działa zarówno w systemie Windows jak Unix / MacOS.
Al myślał, że to proste, rozwiązuje powyższe problemy ...
Pojęcie
Zasadniczo nie śledź
.ipnyb
-plików, tylko odpowiadające im.py
pliki.Po uruchomieniu serwera notebooka z
--script
opcją ten plik jest automatycznie tworzony / zapisywany podczas zapisywania notebooka.Te
.py
pliki zawierają wszystkie dane wejściowe; non-code jest zapisywany w komentarzach, podobnie jak granice komórek. Te pliki można odczytać / zaimportować (i przeciągnąć) na serwer notebooka, aby (ponownie) utworzyć notes. Nie ma już wyjścia; dopóki nie zostanie ponownie uruchomiony.Osobiście używam mercurial do śledzenia wersji
.py
plików; i użyj zwykłych poleceń (wiersza poleceń), aby dodać, zameldować się (ect). Na to pozwala większość innych (D) VCS.Teraz łatwo jest śledzić historię;
.py
są małe, tekstowych i prosty diff. Raz na jakiś czas potrzebujemy klona (po prostu oddziału; uruchom tam drugi notebook-sever) lub starszej wersji (sprawdź i zaimportuj na serwer notebooka) itp.Porady & Triki
--script
opcją) i wykonaj śledzenie wersji.py
plik -f, ale go nie rejestruje .Życzenia
file@date+rev.py
Pomocne przy kasie (na przykład) ) powinno być dodanie pracy; i może zrobię to raz. Do tej pory robię to ręcznie.źródło
.py
pliku do notebooka? Lubię to podejście, ale ponieważ.ipynb
->.py
->.ipynb
jest potencjalnie stratny, nie wziąłem tego za poważnie..py
na.ipynb
format. Jest w tym problem - być może będzie to stanowić podstawę do kompletnego rozwiązania..py
plików do.ipynb
plików.nbconvert
wydaje się jeszcze nie obsługiwać tego i nie mam pulpitu nawigacyjnego notebooka, ponieważ uruchamiam goipython notebook
ręcznie. Czy masz jakieś ogólne sugestie dotyczące sposobu wdrożenia tej konwersji wstecznej?.py
transformacja z notebooka nie ma na celu podróży w obie strony. Więc to nie może być ogólne rozwiązanie, chociaż fajnie, że działa dla ciebie.Aby kontynuować doskonały skrypt Pietro Battistona, jeśli wystąpi błąd analizowania Unicode, taki jak ten:
Możesz dodać na początku skryptu:
źródło
Zbudowałem pakiet python, który rozwiązuje ten problem
https://github.com/brookisme/gitnb
Zapewnia CLI z inspirowaną gitem składnią do śledzenia / aktualizacji / różnicowania notebooków wewnątrz repozytorium git.
Oto przykład
Zwróć uwagę, że ostatnim krokiem, w którym używam polecenia „gitnb commit”, jest zatwierdzenie repozytorium git. Jest to zasadniczo opakowanie dla
Istnieje kilka innych metod, które można skonfigurować tak, aby wymagały mniej lub więcej wkładu użytkownika na każdym etapie, ale taki jest ogólny pomysł.
źródło
Po przekopaniu się, w końcu znalazłem ten stosunkowo prosty haczyk przed zapisaniem w dokumentacji Jupytera . Usuwa dane wyjściowe komórki. Musisz wkleić go do
jupyter_notebook_config.py
pliku (instrukcje poniżej).Z odpowiedzi Richa Signella :
źródło
Zrobiłem to, co zrobili Albert & Rich - nie wersjonuj plików .ipynb (ponieważ mogą one zawierać obrazy, co robi się bałagan). Zamiast tego albo zawsze uruchom
ipython notebook --script
lub włóżc.FileNotebookManager.save_script = True
plik konfiguracyjny, aby (wersja).py
był zawsze tworzony podczas zapisywania notebooka.Aby zregenerować notebooki (po sprawdzeniu repozytorium lub zmianie gałęzi) wstawiam skrypt py_file_to_notebooks.py w katalogu, w którym przechowuję swoje notebooki.
Teraz, po sprawdzeniu repozytorium, po prostu uruchom,
python py_file_to_notebooks.py
aby wygenerować pliki ipynb. Po zmianie gałęzi może być konieczne uruchomieniepython py_file_to_notebooks.py -ov
celu zastąpienia istniejących plików ipynb.Aby być bezpiecznym, dobrze jest również dodać
*.ipynb
do swojego.gitignore
pliku.Edycja: Już tego nie robię, ponieważ (A) musisz regenerować swoje notesy z plików py za każdym razem, gdy kasujesz gałąź, i (B) istnieją inne rzeczy, takie jak obniżanie cen w notatnikach, które tracisz. Zamiast tego usuwam dane wyjściowe z notebooków za pomocą filtra git. Dyskusja na temat tego, jak to zrobić, znajduje się tutaj .
źródło
.py
plików z powrotem.ipynb
jest problematyczna, szczególnie w przypadku notebooków w wersji 4, dla których nie ma jeszcze konwertera. W tej chwili należałoby użyć importera v3, a następnie przekonwertować na v4 i jestem trochę zaniepokojony tą skomplikowaną podróżą. Ponadto,.py
plik nie jest to bardzo dobry wybór, jeśli notebook jest przede wszystkim kod Julia! Wreszcie--script
jest przestarzałe, więc myślę, że haczyki są dobrym rozwiązaniem.Ok, więc wygląda na to, że jest to obecnie najlepsze rozwiązanie, zgodnie z dyskusją tutaj , jest utworzenie filtra git, aby automatycznie usuwać dane wyjściowe z plików ipynb podczas zatwierdzania.
Oto, co zrobiłem, aby to działało (skopiowane z tej dyskusji):
Lekko zmodyfikowałem plik nbstripout cfriedline, aby dać błąd informacyjny, gdy nie możesz zaimportować najnowszego IPython: https://github.com/petered/plato/blob/fb2f4e252f50c79768920d0e47b870a8d799e92b/notebooks/config/strip_notebook_outputo i dodałem to do mojej odpowiedzi powiedzieć w
./relative/path/to/strip_notebook_output
Dodano także plik .gitattributes do katalogu głównego repozytorium, zawierający:
I stworzył
setup_git_filters.sh
zawierającyI pobiegł
source setup_git_filters.sh
. Fantazyjne $ (git rev-parse ...) polega na znalezieniu lokalnej ścieżki repozytorium na dowolnej (uniksowej) maszynie.źródło
To rozszerzenie jupyter umożliwia użytkownikom wypychanie notesów jupyter bezpośrednio do github.
Proszę spojrzeć tutaj
https://github.com/sat28/githubcommit
źródło
Jest kwiecień 2020 r. I istnieje wiele strategii i narzędzi do kontroli wersji notebooków Jupyter. Oto krótki przegląd wszystkich dostępnych narzędzi,
nbdime - Nicea do lokalnego różnicowania i łączenia zeszytów
nbstripout - Filtr git do automatycznego usuwania wyników z notebooka przed każdym zatwierdzeniem
jupytext - Utrzymuje plik towarzyszący .py zsynchronizowany z każdym notatnikiem. Zatwierdzasz tylko pliki .py
nbconvert - Konwertuj notebooki na skrypt Pythona lub HTML (lub oba) i zatwierdzaj te alternatywne typy plików
ReviewNB - Pokazuje różnicę w notatniku (wraz z danymi wyjściowymi) dla każdego żądania zatwierdzenia lub pobrania w GitHub. Można również pisać komentarze do komórek notebooka, aby omówić zmiany (zrzut ekranu poniżej).
Uwaga: Zbudowałem ReviewNB.
źródło
Co powiesz na pomysł omówiony w poniższym poście, w którym należy przechowywać dane wyjściowe notebooka, z argumentem, że wygenerowanie go może zająć dużo czasu, i jest to przydatne, ponieważ GitHub może teraz renderować notebooki. Dodano haki automatycznego zapisywania do eksportowania pliku .py, używanego do różnic i .html do udostępniania członkom zespołu, którzy nie używają notesów ani gita.
https://towardsdatascience.com/version-control-for-jupyter-notebook-3e6cef13392d
źródło