代码之家  ›  专栏  ›  技术社区  ›  president

在pytest中运行jupyter笔记本测试。奥瑟罗

  •  3
  • president  · 技术社区  · 6 年前

    我有一个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 回复  |  直到 6 年前
        1
  •  3
  •   hoefling    6 年前

    你的 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 阿尔茨海默病 ,例如:

    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