I am doing fresh install of tutor openedx on my WSL Ubuntu.
tutor dev launch
got crashed with python error while start Building image openedx-dev:20.0.1
System:
Python 3.12.12
tutor, version 20.0.1
Docker Desktop 4.46.0 (204649)
few last lines from logs:
File “/home/waqar/openedx/env/lib/python3.12/site-packages/tutor/utils.py”, line 217, in execute
click.echo(fmt.command(shlex.join(command)))
^^^^^^^^^^^^^^^^^^^
File “/home/waqar/.pyenv/versions/3.12.12/lib/python3.12/shlex.py”, line 318, in
join
return ’ '.join(quote(arg) for arg in
split_command)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/waqar/.pyenv/versions/3.12.12/lib/python3.12/shlex.py”, line 318, in
return ’ '.join(quote(arg) for arg in split_command)
^^^^^^^^^^^^^^^^^^^^^
File “/home/waqar/.pyenv/versions/3.12.12/lib/python3.12/shlex.py”, line 327, in quote
if \_find_unsafe(s) is None:
^^^^^^^^^^^^^^^
TypeError: expected string or bytes-like object, got ‘Sentinel’
Yogesh
(Yogesh)
October 14, 2025, 6:15pm
2
There is a bug from latest version of click.
Here is an issue for the same and also a temporary solution too:
opened 06:17PM - 19 Sep 25 UTC
bug
## Bug description
Click 8.3.0 introduced a breaking change where optional para… meters without defaults now receive a `Sentinel` object instead of `None`: https://github.com/pallets/click/commit/b64ea07128a6368b5f6f93035c75d5693c7ba572
This causes `tutor dev launch` to fail with a `TypeError` when building dev Docker images because the `Sentinel` object is passed to `shlex.join()`, which expects only string arguments.
```bash
/home/pupkin/tutor-19.0.5/. $ TUTOR_ROOT=$(pwd) tutor dev launch
⚠️ Failed to enable plugin 'indigo': plugin 'indigo' is not installed.
⚠️ Failed to enable plugin 'mfe': plugin 'mfe' is not installed.
==================================================
Interactive platform configuration
==================================================
As you are not running this platform in production, we automatically set the following configuration values:
LMS_HOST = local.openedx.io
CMS_HOST = studio.local.openedx.io
ENABLE_HTTPS = False
Your platform name/title [My Open edX]
Your public contact email address [contact@local.openedx.io]
The default language code for the platform [en]
Configuration saved to /home/pupkin/tutor-19.0.5/config.yml
Environment generated in /home/pupkin/tutor-19.0.5/env
======================================
Building Docker images
======================================
Building image openedx-dev:19.0.5
Traceback (most recent call last):
File "/home/pupkin/tutor-19.0.5/.venv/bin/tutor", line 7, in <module>
sys.exit(main())
^^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/tutor/commands/cli.py", line 27, in main
cli() # pylint: disable=no-value-for-parameter
^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/click/core.py", line 1462, in __call__
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/click/core.py", line 1383, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/click/core.py", line 1850, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/click/core.py", line 1850, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/click/core.py", line 1246, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/click/core.py", line 814, in invoke
return callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/click/decorators.py", line 34, in new_func
return f(get_current_context(), *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/tutor/commands/compose.py", line 138, in launch
context.invoke(images.build, image_names=images_to_build)
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/click/core.py", line 814, in invoke
return callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/click/decorators.py", line 46, in new_func
return f(get_current_context().obj, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/tutor/commands/images.py", line 241, in build
images.build(
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/tutor/images.py", line 11, in build
utils.docker(*command)
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/tutor/utils.py", line 193, in docker
return execute("docker", *command)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pupkin/tutor-19.0.5/.venv/lib/python3.11/site-packages/tutor/utils.py", line 217, in execute
click.echo(fmt.command(shlex.join(command)))
^^^^^^^^^^^^^^^^^^^
File "/home/pupkin/.pyenv/versions/3.11.8/lib/python3.11/shlex.py", line 320, in join
return ' '.join(quote(arg) for arg in split_command)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pupkin/.pyenv/versions/3.11.8/lib/python3.11/shlex.py", line 320, in <genexpr>
return ' '.join(quote(arg) for arg in split_command)
^^^^^^^^^^
File "/home/pupkin/.pyenv/versions/3.11.8/lib/python3.11/shlex.py", line 329, in quote
if _find_unsafe(s) is None:
^^^^^^^^^^^^^^^
TypeError: expected string or bytes-like object, got 'Sentinel'
```
**How to reproduce**
1. Set up Python environment:
```bash
echo 3.11.8 > .python-version
uv venv --python 3.11.8 .venv
source .venv/bin/activate
```
2. Install tutor:
```bash
uv pip install "tutor==19.0.5"
```
3. Run the failing command
`tutor dev launch`
**Environment**
- **OS**: MacOS Sequoia (also reproduced on Ubuntu)
- **Python**: 3.11.8
- **Tutor**: 19.0.5 and 20.0.1
- **Click**: 8.3.0 (works fine with click <8.3.0)
**Temporary fix**
Install older version of click: `uv pip install "click<8.3"`
thanks for the reply. I will check it out.
teeeeee12
(teeeeeee)
October 16, 2025, 7:10am
4
The issue occurs because Tutor isn’t compatible with click v8.3.0 , which changed how optional parameters are handled and causes a TypeError during tutor dev launch.
Temporary fix: downgrade click by running “pip install click==8.1.8”.
1 Like