Uruchamianie notatnika IPython / Jupyter w trybie nieinteraktywnym

79

Czy ktoś wie, czy możliwe jest uruchomienie notatnika IPython / Jupyter w trybie nieinteraktywnym z wiersza poleceń i .ipynbzapisanie pliku wynikowego z wynikami uruchomienia. Jeśli nie jest to już możliwe, jak trudno byłoby zaimplementować z phantomJS coś do włączania i wyłączania jądra oraz coś do włączania i wyłączania serwera WWW?

Mówiąc dokładniej, załóżmy, że mam już notatnik original.ipynbi chcę ponownie uruchomić wszystkie komórki w tym notatniku i zapisać wyniki w nowym notatniku new.ipynb, ale zrób to za pomocą jednego polecenia w wierszu poleceń bez konieczności interakcji w przeglądarce lub aby zamknąć jądro lub serwer WWW, zakładając, że nie działa już jądro lub serwer WWW.

przykładowe polecenie:

$ ipython notebook run original.ipynb --output=new.ipynb

davidshinn
źródło

Odpowiedzi:

70

Tak, jest to możliwe i łatwe, będzie (głównie) w rdzeniu IPython dla 2.0, sugerowałbym przyjrzenie się tym przykładom na razie.

[edytować]

$ jupyter nbconvert --to notebook --execute original.ipynb --output=new.ipynb

Jest teraz w Jupyter NbConvert. NbConvert zawiera kilka opcji, Preprocessorktóre są domyślnie wyłączone, a dwa z nich ( ClearOutputPreprocessori ExecutePreprocessor) są interesujące. Możesz je włączyć w swoich (lokalnych | globalnych) plikach konfiguracyjnych za pomocą c.<PreprocessorName>.enabled=True(Wielkie litery to python) lub w wierszu poleceń, --ExecutePreprocessor.enabled=Truezachowując resztę polecenia jak zwykle.

--ExecutePreprocessor.enabled=TruePosiada dogodne --executealias, które można wykorzystać na najnowszej wersji NbConvert. W --inplacerazie potrzeby można go łączyć

Na przykład przekonwertuj na html po uruchomieniu notebooka bez głowy:

$ jupyter nbconvert --to=html --execute RunMe.ipynb

konwersja do formatu PDF po usunięciu danych wyjściowych

$ ipython nbconvert --to=pdf --ClearOutputPreprocessor.enabled=True RunMe.ipynb

To (oczywiście) działa z jądrem innym niż Python, tworząc <insert-your-language-here>jądro, jeśli ustawisz --profile=<your fav profile>. Konwersja może trwać naprawdę długo, o ile wymaga ponownego uruchomienia notebooka. Możesz dokonać konwersji notebooka na notebook z --to=notebookopcją.

Istnieje wiele innych opcji (przekroczenie limitu czasu, zezwalanie na błędy, ...), które mogą wymagać ustawienia / wyłączenia w zależności od przypadku użycia. Zobacz dokumentację i oczywiście jupyter nbconvert --help, --help-allczy nbconvert dokumentacji online , aby uzyskać więcej informacji.

Matt
źródło
1
Dziękuję za wskazanie mi właściwego kierunku. Ponieważ dokładny kod nie został opublikowany, rozwidliłem jeden z głównych elementów i dodałem kod wyjściowy, aby następujący uruchomił notatnik z wiersza poleceń, tak jak pożądany $ ipnbdocttest.py original.ipynb new.ipynb gist.github.com/davidshinn/6110231
davidshinn
3
Nie, nie w IPythonie 2, w drodze na IPython 3
Matt
7
Wygląda na to, że to jest teraz (Ipython 3.1.0): ipython nbconvert --to=html --execute RunMe.ipynb
patricksurry
5
@NoahR Spróbuj --ExecutePreprocessor.timeout=-1 ref
Lenna
5
Najnowszy jupyter (4.1.0) rzeczywiście pozwala uruchomić notebooki nieinteraktywnie jupyter nbconvert --to notebook --execute --allow-errors notebook.ipynbmoże odpowiedź może być edytowany
mgalardini
20

Dopóki ta funkcja nie stanie się częścią rdzenia, stworzyłem małą aplikację wiersza poleceń, która robi dokładnie to, co chcesz. Nazywa się runipy i możesz go zainstalować za pomocą pip install runipy. Źródło i readme są na github .

Paweł
źródło
runipy nie wydaje się działać tak dobrze dla mnie: nie aktualizuje signaturepola, aw konsekwencji (cóż, myślę, że jest to konsekwencja), żaden z moich plików SVG nie jest faktycznie renderowany: IPython woli __repr__zamiast tego wyświetlać zwykłe renderowanie tekstowe .
akim
1

Uruchom i zamień oryginalny plik .ipunb:

jupyter nbconvert --ExecutePreprocessor.timeout=-1 --to notebook --inplace --execute original.ipynb
Manualmsdos
źródło
1

Aby pokryć niektóre funkcje, takie jak pracownicy równolegli, parametry wejściowe, wysyłanie wiadomości e-mail lub wejście / wyjście S3 ... możesz zainstalować jupyter-runner

pip install jupyter-runner

Readme na github: https://github.com/omar-masmoudi/jupyter-runner

Omar
źródło
-5

Możesz po prostu uruchomić serwer iPython-Notebook za pomocą wiersza poleceń:

ipython notebook --pylab inline

Spowoduje to uruchomienie serwera w trybie nieinteraktywnym, a wszystkie dane wyjściowe zostaną wydrukowane pod kodem. Następnie możesz zapisać plik .ipynb, który zawiera kod i dane wyjściowe.

ala
źródło
Dziękuję za odpowiedź, jednak szukałem bardziej konkretnego rozwiązania, które nie wymagałoby żadnej interwencji w przeglądarce internetowej, ani zamknięcia jądra i serwera WWW. Zredagowałem pytanie, aby było bardziej szczegółowe.
davidshinn
W tym przypadku nie wiem, jak postępować. Czy planujesz to robić regularnie? Notatnik iPython jest przeznaczony do interaktywnego użytku w przeglądarce, a zapisywanie określonych plików ipynb z wiersza poleceń wydaje mi się raczej dziwne.
ala
Tak, planuję to robić bardzo często, jeśli będzie to możliwe. Byłoby to bardzo przydatne w przypadkach, gdy źródła danych często się zmieniają i chcę zobaczyć wyniki diagnostyczne z używania pand przeplatanych z wygenerowanym przez nie kodem, dokładnie to, co notebook ipython robi bardzo dobrze. Jeśli jednak mam wiele takich procesów do uruchomienia dziennie, byłoby lepiej, gdyby można je było uruchamiać wsadowo, a potem mógłbym spojrzeć na dane wyjściowe później, tak jakby utworzono pliki dziennika. Problem ze standardowym rejestrowaniem polega na tym, że trudno jest zobaczyć kod i dane wyjściowe przeplatane ze sobą.
davidshinn
4
Wydaje mi się, że jest to niezwykle przydatny przypadek użycia. Możesz wziąć szablon notatnika, trochę go sparametryzować, a następnie uzyskać w pełni wykonane rozwiązanie do wydrukowania, a wszystko to bez dotykania przeglądarki.
holdenweb