Bug 2389378

Summary: python-jupyter-client: FTBFS in Fedora Rawhide and F43
Product: [Fedora] Fedora Reporter: Miro Hrončok <mhroncok>
Component: python-jupyter-clientAssignee: Miro Hrončok <mhroncok>
Status: CLOSED ERRATA QA Contact: Fedora Extras Quality Assurance <extras-qa>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 43CC: cbm, jonathan, mhroncok, python-packagers-sig, romain.geissler
Target Milestone: ---Flags: mhroncok: needinfo+
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
URL: https://koschei.fedoraproject.org/package/python-jupyter-client
Whiteboard:
Fixed In Version: python-jupyter-client-8.6.1-18.fc44 python-jupyter-client-8.6.1-18.fc43 Doc Type: ---
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2025-08-26 15:20:01 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 2384424, 2373702    

Description Miro Hrončok 2025-08-19 11:07:50 UTC
Description of problem:
Package python-jupyter-client fails to build from source in Fedora Rawhide.

Version-Release number of selected component (if applicable):
8.6.1-15.fc43

Steps to Reproduce:
fedpkg build

Additional info:
This package is tracked by Koschei. See:
https://koschei.fedoraproject.org/package/python-jupyter-client

----


=================================== FAILURES ===================================
___________________ TestAsyncKernelClient.test_input_request ___________________
self = <tests.test_client.TestAsyncKernelClient object at 0x7fffab96bed0>
kc = <jupyter_client.asynchronous.client.AsyncKernelClient object at 0x7fffab96bb10>
    @pytest.mark.skipif(
        sys.platform != "linux" or platform.python_implementation().lower() == "pypy",
        reason="only works with cpython on ubuntu in ci",
    )
    async def test_input_request(self, kc):
        with mock.patch("builtins.input", return_value="test\n"):
>           reply = await kc.execute_interactive("a = input()", timeout=TIMEOUT)
kc         = <jupyter_client.asynchronous.client.AsyncKernelClient object at 0x7fffab96bb10>
self       = <tests.test_client.TestAsyncKernelClient object at 0x7fffab96bed0>
tests/test_client.py:132: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
self = <jupyter_client.asynchronous.client.AsyncKernelClient object at 0x7fffab96bb10>
code = 'a = input()', silent = False, store_history = True
user_expressions = None, allow_stdin = True, stop_on_error = True
timeout = 29.995466409018263
output_hook = <bound method KernelClient._output_hook_default of <jupyter_client.asynchronous.client.AsyncKernelClient object at 0x7fffab96bb10>>
stdin_hook = <bound method KernelClient._stdin_hook_default of <jupyter_client.asynchronous.client.AsyncKernelClient object at 0x7fffab96bb10>>
    async def _async_execute_interactive(
        self,
        code: str,
        silent: bool = False,
        store_history: bool = True,
        user_expressions: t.Optional[t.Dict[str, t.Any]] = None,
        allow_stdin: t.Optional[bool] = None,
        stop_on_error: bool = True,
        timeout: t.Optional[float] = None,
        output_hook: t.Optional[t.Callable] = None,
        stdin_hook: t.Optional[t.Callable] = None,
    ) -> t.Dict[str, t.Any]:
        """Execute code in the kernel interactively
    
        Output will be redisplayed, and stdin prompts will be relayed as well.
        If an IPython kernel is detected, rich output will be displayed.
    
        You can pass a custom output_hook callable that will be called
        with every IOPub message that is produced instead of the default redisplay.
    
        .. versionadded:: 5.0
    
        Parameters
        ----------
        code : str
            A string of code in the kernel's language.
    
        silent : bool, optional (default False)
            If set, the kernel will execute the code as quietly possible, and
            will force store_history to be False.
    
        store_history : bool, optional (default True)
            If set, the kernel will store command history.  This is forced
            to be False if silent is True.
    
        user_expressions : dict, optional
            A dict mapping names to expressions to be evaluated in the user's
            dict. The expression values are returned as strings formatted using
            :func:`repr`.
    
        allow_stdin : bool, optional (default self.allow_stdin)
            Flag for whether the kernel can send stdin requests to frontends.
    
            Some frontends (e.g. the Notebook) do not support stdin requests.
            If raw_input is called from code executed from such a frontend, a
            StdinNotImplementedError will be raised.
    
        stop_on_error: bool, optional (default True)
            Flag whether to abort the execution queue, if an exception is encountered.
    
        timeout: float or None (default: None)
            Timeout to use when waiting for a reply
    
        output_hook: callable(msg)
            Function to be called with output messages.
            If not specified, output will be redisplayed.
    
        stdin_hook: callable(msg)
            Function or awaitable to be called with stdin_request messages.
            If not specified, input/getpass will be called.
    
        Returns
        -------
        reply: dict
            The reply message for this request
        """
        if not self.iopub_channel.is_alive():
            emsg = "IOPub channel must be running to receive output"
            raise RuntimeError(emsg)
        if allow_stdin is None:
            allow_stdin = self.allow_stdin
        if allow_stdin and not self.stdin_channel.is_alive():
            emsg = "stdin channel must be running to allow input"
            raise RuntimeError(emsg)
        msg_id = await ensure_async(
            self.execute(
                code,
                silent=silent,
                store_history=store_history,
                user_expressions=user_expressions,
                allow_stdin=allow_stdin,
                stop_on_error=stop_on_error,
            )
        )
        if stdin_hook is None:
            stdin_hook = self._stdin_hook_default
        # detect IPython kernel
        if output_hook is None and "IPython" in sys.modules:
            from IPython import get_ipython
    
            ip = get_ipython()  # type:ignore[no-untyped-call]
            in_kernel = getattr(ip, "kernel", False)
            if in_kernel:
                output_hook = partial(
                    self._output_hook_kernel,
                    ip.display_pub.session,
                    ip.display_pub.pub_socket,
                    ip.display_pub.parent_header,
                )
        if output_hook is None:
            # default: redisplay plain-text outputs
            output_hook = self._output_hook_default
    
        # set deadline based on timeout
        if timeout is not None:
            deadline = time.monotonic() + timeout
        else:
            timeout_ms = None
    
        poller = zmq.Poller()
        iopub_socket = self.iopub_channel.socket
        poller.register(iopub_socket, zmq.POLLIN)
        if allow_stdin:
            stdin_socket = self.stdin_channel.socket
            poller.register(stdin_socket, zmq.POLLIN)
        else:
            stdin_socket = None
    
        # wait for output and redisplay it
        while True:
            if timeout is not None:
                timeout = max(0, deadline - time.monotonic())
                timeout_ms = int(1000 * timeout)
            events = dict(poller.poll(timeout_ms))
            if not events:
                emsg = "Timeout waiting for output"
>               raise TimeoutError(emsg)
E               TimeoutError: Timeout waiting for output
allow_stdin = True
code       = 'a = input()'
deadline   = 923048.677437543
emsg       = 'Timeout waiting for output'
events     = {}
get_ipython = <function get_ipython at 0x7fffaccc4ca0>
in_kernel  = False
iopub_socket = <zmq.asyncio.Socket(zmq.SUB) at 0x7fffab430180>
ip         = None
msg        = {'buffers': [], 'content': {'name': 'stdout', 'text': 'a = input()'}, 'header': {'date': datetime.datetime(2025, 8, 16...354404062494f0_859_9', 'msg_type': 'stream', 'session': '914a2b8a-855b0e8a8f354404062494f0', ...}, 'metadata': {}, ...}
msg_id     = 'ef18dc52-dacd005a30564d83e459a2c9_674_2'
output_hook = <bound method KernelClient._output_hook_default of <jupyter_client.asynchronous.client.AsyncKernelClient object at 0x7fffab96bb10>>
poller     = <zmq.sugar.poll.Poller object at 0x7fffab48d4f0>
req        = {'buffers': [], 'content': {'password': False, 'prompt': 'Echo Prompt'}, 'header': {'date': datetime.datetime(2025, 8,...2494f0_859_10', 'msg_type': 'input_request', 'session': '914a2b8a-855b0e8a8f354404062494f0', ...}, 'metadata': {}, ...}
res        = <coroutine object KernelClient._stdin_hook_default at 0x7fffab438220>
self       = <jupyter_client.asynchronous.client.AsyncKernelClient object at 0x7fffab96bb10>
silent     = False
stdin_hook = <bound method KernelClient._stdin_hook_default of <jupyter_client.asynchronous.client.AsyncKernelClient object at 0x7fffab96bb10>>
stdin_socket = <zmq.asyncio.Socket(zmq.DEALER) at 0x7fffaba8dc70>
stop_on_error = True
store_history = True
timeout    = 29.995466409018263
timeout_ms = 29995
user_expressions = None
jupyter_client/client.py:550: TimeoutError
----------------------------- Captured stdout call -----------------------------
a = input()

Comment 1 Miro Hrončok 2025-08-19 11:08:25 UTC
Considering this is a timeout error, I'll submit several scratch builds to see if the failure is consistent.

Comment 2 Miro Hrončok 2025-08-19 11:33:06 UTC
One build out of 10 passed. I am trying to increase the timeout.

Comment 3 Miro Hrončok 2025-08-26 11:08:43 UTC
Hello. This is a bulk comment.

This package still needs to be rebuilt and/or shipped with Python 3.14.0rc2+ bytecode in Fedora 43.

The Beta Freeze of Fedora 43 is scheduled to start today. Please prioritize this bugzilla accordingly.

Thanks.

Comment 4 Fedora Update System 2025-08-26 13:01:01 UTC
FEDORA-2025-0c92524cc6 (python-jupyter-client-8.6.1-18.fc44) has been submitted as an update to Fedora 44.
https://bodhi.fedoraproject.org/updates/FEDORA-2025-0c92524cc6

Comment 5 Fedora Update System 2025-08-26 13:01:04 UTC
FEDORA-2025-c983eb7b6d (python-jupyter-client-8.6.1-18.fc43) has been submitted as an update to Fedora 43.
https://bodhi.fedoraproject.org/updates/FEDORA-2025-c983eb7b6d

Comment 6 Fedora Update System 2025-08-26 15:20:01 UTC
FEDORA-2025-0c92524cc6 (python-jupyter-client-8.6.1-18.fc44) has been pushed to the Fedora 44 stable repository.
If problem still persists, please make note of it in this bug report.

Comment 7 Fedora Update System 2025-08-26 15:20:08 UTC
FEDORA-2025-c983eb7b6d (python-jupyter-client-8.6.1-18.fc43) has been pushed to the Fedora 43 stable repository.
If problem still persists, please make note of it in this bug report.