Запуск теста ноутбука Jupyter в pytest.OSError - PullRequest
0 голосов
/ 18 мая 2018

У меня есть тест на python, который должен запустить файл записной книжки Jupyter и проверить его на наличие ошибок.Когда я запускаю его, он возвращает ошибку: OSError: [Errno 8] Exec format error: './file.ipynb'

Кто-нибудь знает, как это исправить?

То, что я нашел в похожих вопросах, похоже, не в моем случае.

Мой код указан ниже:

import os
import subprocess
import tempfile

import nbformat


def _notebook_run(path):
    """Execute a notebook via nbconvert and collect output.
       :returns (parsed nb object, execution errors)
    """
    dirname, __ = os.path.split(path)
    os.chdir(dirname)
    with tempfile.NamedTemporaryFile(suffix=".ipynb") as fout:
        args = [path, fout.name, "nbconvert", "--to", "notebook", "--execute",
          "--ExecutePreprocessor.timeout=60",
          "--output"]
        subprocess.check_call(args)

        fout.seek(0)
        nb = nbformat.read(fout, nbformat.current_nbformat)

    errors = [output for cell in nb.cells if "outputs" in cell
                     for output in cell["outputs"]\
                     if output.output_type == "error"]

    return nb, errors

def test_ipynb():
    nb, errors = _notebook_run('./file.ipynb')
    assert errors == []

1 Ответ

0 голосов
/ 18 мая 2018

Ваш args не прав.По сути, вы вызываете

$ ./file.ipynb tempfile.ipynb nbconvert --to notebook \
    --execute --ExecutePrerocessor.timeout=60 --output

. Это не работает, потому что file.ipynb не является исполняемым файлом.Вместо этого вам нужно вызвать jupyter:

$ jupyter nbconvert ./file.ipynb --output tempfile.ipynb --to notebook \
    --execute --ExecutePrerocessor.timeout=60

В переводе на Python args это будет, например,

import shutil

...

jupyter_exec = shutil.which('jupyter')
if jupyter_exec is not None:
    args = [jupyter_exec, "nbconvert", path, 
            "--output", fout.name, 
            "--to", "notebook", 
            "--execute", "--ExecutePreprocessor.timeout=60"]
    subprocess.check_call(args)
else:
    # jupyter not installed or not found in PATH
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...