# Tutor dev launch failed with Python 3.12.12

**URL:** <https://discuss.openedx.org/t/tutor-dev-launch-failed-with-python-3-12-12/17360>\
**Category:** Tutor Help\
**Tags:** tutor\
**Created:** [October 11, 2025, 1:21pm UTC](https://discuss.openedx.org/t/tutor-dev-launch-failed-with-python-3-12-12/17360 "2025-10-11T13:21:14Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![waqarmuneer](https://avatars.discourse-cdn.com/v4/letter/w/f0a364/32.png) [@waqarmuneer](https://discuss.openedx.org/u/waqarmuneer)\
**Post date:** [October 11, 2025, 1:21pm UTC](https://discuss.openedx.org/t/tutor-dev-launch-failed-with-python-3-12-12/17360/1 "2025-10-11T13:21:14Z")

</div>

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’

---

<div class="post-metadata">

**Author:** ![Yogesh](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.openedx.org/yogesh/32/8319_2.png) [@Yogesh](https://discuss.openedx.org/u/Yogesh)\
**Post date:** [October 14, 2025, 6:15pm UTC](https://discuss.openedx.org/t/tutor-dev-launch-failed-with-python-3-12-12/17360/2 "2025-10-14T18:15:57Z")

</div>

There is a bug from latest version of click.  
Here is an issue for the same and also a temporary solution too:

> <https://github.com/overhangio/tutor/issues/1276>
>
> \## 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"\`

---

<div class="post-metadata">

**Author:** ![waqarmuneer](https://avatars.discourse-cdn.com/v4/letter/w/f0a364/32.png) [@waqarmuneer](https://discuss.openedx.org/u/waqarmuneer)\
**Post date:** [October 14, 2025, 7:32pm UTC](https://discuss.openedx.org/t/tutor-dev-launch-failed-with-python-3-12-12/17360/3 "2025-10-14T19:32:33Z")

</div>

thanks for the reply. I will check it out.

---

<div class="post-metadata">

**Author:** ![teeeeee12](https://avatars.discourse-cdn.com/v4/letter/t/bc79bd/32.png) [@teeeeee12](https://discuss.openedx.org/u/teeeeee12)\
**Post date:** [October 16, 2025, 7:10am UTC](https://discuss.openedx.org/t/tutor-dev-launch-failed-with-python-3-12-12/17360/4 "2025-10-16T07:10:24Z")

</div>

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`”`.
