Troubleshooting
Start with juphyter doctor. It names the failing part, and for a Python on the wrong PATH it prints the export line that fixes it.
A kernel stopped working
The kernel records absolute paths to a PHP binary, a Python interpreter, and juphyter itself. Upgrading or removing any of them breaks the kernel, and juphyter doctor marks it fail.
- Run
juphyter installagain with the same--nameto record the current paths. - A kernel installed into a project breaks when the project’s
vendordirectory is deleted. Runcomposer installin the project, or uninstall the kernel.
No Python can host the kernel
juphyter install looks for an interpreter in this order: the one named by --python, then the one that owns the jupyter command on PATH. When that interpreter has no ipykernel 7, it builds a virtual environment with JupyterLab instead of installing into it.
- System and Homebrew Python builds are externally managed, and
pip installinto them refuses. The virtual environment avoids that. - An environment that already exists at the
--create-venvpath is reused, and its packages are installed again, so a second run finishes an interrupted one. - A directory at that path that holds something other than an environment is refused.
- With
--python, the command builds nothing. When the named interpreter has no ipykernel, it prints thepip installcommand for that interpreter and writes no kernel.
Quarto
Quarto cannot find the kernel
ERROR: Jupyter kernel 'php' not found. Known kernels: python3
Quarto’s interpreter has no Jupyter in it, so it can list no kernels. juphyter doctor reports this as Quarto: not ready. and prints the fix. Python interpreters and editors covers how to point Quarto at an interpreter that has Jupyter.
KeyError: 'path' with a kernelspec block
Quarto accepts the fuller front matter that Jupyter writes into a notebook, but for juphyter it also needs path, the directory that holds kernel.json:
---jupyter: kernelspec: name: php85 language: php display_name: "PHP 8.5" path: /Users/you/Library/Jupyter/kernels/php85---Quarto reads path to look for a setup cell beside the kernelspec, which it does for any language it has no built-in support for. jupyter: php85 fills it in, so name the kernel instead of describing it.
Unknown message type: 'comm_open'
Every render prints this once. It comes from ipykernel, because the kernel installs no comm manager, and it has no effect on the rendered document. The same absence is why ipywidgets are unsupported.
A new PHP session on every render
Quarto keeps a kernel alive between renders only for languages it can write a setup or cleanup cell for. It has none for PHP, and juphyter install writes none, so each render starts a new PHP session, including with --execute-daemon.
Rendering frozen documents
Quarto looks up a document’s kernel by name before it reads frozen output, so a kernel with that name has to be registered on the rendering machine even when no cell runs. Contributing shows how this repository renders its own site that way.