Zaczynam używać notebooków IPython, aby udokumentować niektóre z mojego kodu z interaktywnymi przykładami użycia. Aby uniknąć dokumentacji, aby uzyskać zbyt daleko z kodu, chciałbym, aby kod w notebooku, aby zrealizować regularnie, aby złapać wszelkie zmiany w wyjściu i flagować błędy środowiska wykonawczego.

Używam nosetests, aby uruchomić testy regresji i zastanawiałem się, czy istnieje sposób, aby wykonać to do tego celu notebooków IPython. Należy pamiętać, że nie próbuję uruchomić nosetests z Notebooka IPython (jak jest wykonywane w IPython_nose). Coś więcej wzdłuż linii wtyczki doctest. Czy taka wtyczka istnieje?

12
DMack 10 grudzień 2013, 03:52

4 odpowiedzi

Najlepsza odpowiedź

Nie wiem o rzeczywistej wtyczce nosowej, aby zrobić to automatycznie, ale Tutaj jest skryptem pokazującym podstawowe elementy, które być konieczne dla czegoś takiego. Inni mają odkąd rozwidlony, aby dodać pewną funkcjonalność.

GIST jest to, że tworzysz ten sam obiekt jądra, który używa notebooka i przebiegać przez takie same wykonanie, które "uruchomić wszystkie" i porównałby wynikowe wyjście. Posiada pewną prymitywną sanitizację, która prawdopodobnie może być w dużej mierze zastąpiona przez odpowiednie funkcje lekarza, ale nie jest super skomplikowany.

5
minrk 10 grudzień 2013, 00:30

Niedawno napisałem skrypt, który robi coś podobnego, a większość z nich była oparta na Ten blog na "testowaniu notebooków Jupsytera"

Oto nieco zmodyfikowana wersja z jednego na blogu:

from glob import glob

import nbformat
from nbconvert.preprocessors import ExecutePreprocessor
from nbconvert.preprocessors.execute import CellExecutionError

def _notebook_run(path):
  """
  Execute a notebook via nbconvert and collect output.
   :returns (parsed nb object, execution errors)
  """
  kernel_name = 'python%d' % sys.version_info[0]
  this_file_directory = os.path.dirname(__file__)
  errors = []


  with open(path) as f:
    nb = nbformat.read(f, as_version=4)
    nb.metadata.get('kernelspec', {})['name'] = kernel_name
    ep = ExecutePreprocessor(kernel_name=kernel_name, timeout=10) #, allow_errors=True

    try:
      ep.preprocess(nb, {'metadata': {'path': this_file_directory}})

    except CellExecutionError as e: 
      if "SKIP" in e.traceback:
        print(str(e.traceback).split("\n")[-2])
      else:
        raise e

  return nb, errors

Możesz teraz użyć tej funkcji jako:

def test_notebooks():
  for notebook in glob("./*.ipynb"):
    nb, errors = _notebook_run(notebook)
    assert errors == []
3
mon95 11 listopad 2016, 05:47

Nosebook może pasować do celów. Zbudowałem go do radzenia sobie z takimi przypadkami: nie wymaga specjalnego znacznika w notebooku i niektóre z sanitizacji wymienionych przez @minrk.

2
bollwyvl 14 luty 2015, 15:44

Ostatnio Andrea ZCA opublikowana Kitest-IPYNB. Nie przetestowałem go jeszcze, ale wydaje się, że pasuje do twoich wymagań (może nie jest skierowany do nosa, ale ma czyste funkcje, takie jak wskazanie komórki na awarie). Na pewno użyję go do zadań i materiałów dla studentów :)

1
D3f0 3 sierpień 2016, 22:57