Bug 2356174 - ipython fails to build with Python 3.14: AssertionErrors, pexpect.exceptions.TIMEOUTs and more in 12 tests
Summary: ipython fails to build with Python 3.14: AssertionErrors, pexpect.exceptions....
Keywords:
Status: NEW
Alias: None
Product: Fedora
Classification: Fedora
Component: ipython
Version: rawhide
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Lumír Balhar
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard:
Depends On:
Blocks: PYTHON3.14
TreeView+ depends on / blocked
 
Reported: 2025-03-31 09:37 UTC by Karolina Surma
Modified: 2025-04-14 12:34 UTC (History)
8 users (show)

Fixed In Version:
Clone Of:
Environment:
Last Closed:
Type: Bug
Embargoed:


Attachments (Terms of Use)


Links
System ID Private Priority Status Summary Last Updated
Github ipython ipython issues 14858 0 None open Test failures with Python 3.14 alpha 6 2025-04-01 14:24:48 UTC

Description Karolina Surma 2025-03-31 09:37:23 UTC
ipython fails to build with Python 3.14.0a6.

_____________ ERROR at teardown of TestAstTransform2.test_run_cell _____________

self = <IPython.core.tests.test_interactiveshell.TestAstTransform2 testMethod=test_run_cell>

    def tearDown(self):
>       ip.ast_transformers.remove(self.intwrapper)
E       ValueError: list.remove(x): x not in list

_________________________ AsyncTest.test_memory_error __________________________

self = <IPython.core.tests.test_async_helpers.AsyncTest testMethod=test_memory_error>

    def test_memory_error(self):
        """
        The pgen parser in 3.8 or before use to raise MemoryError on too many
        nested parens anymore"""
    
>       iprc("(" * 200 + ")" * 200)

core/tests/test_async_helpers.py:289: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
core/tests/test_async_helpers.py:23: in iprc
    return ip.run_cell(dedent(x)).raise_error()
core/interactiveshell.py:306: in raise_error
    raise self.error_before_exec
core/interactiveshell.py:3308: in run_cell_async
    code_ast = compiler.ast_parse(cell, filename=cell_name)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <IPython.core.compilerop.CachingCompiler object at 0x7f6debe89940>
source = '(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((...))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n'
filename = '<ipython-input-1-ab69bc0f135a>', symbol = 'exec'

    def ast_parse(self, source, filename='<unknown>', symbol='exec'):
        """Parse code to an AST with the current compiler flags active.
    
        Arguments are exactly the same as ast.parse (in the standard library),
        and are passed to the built-in compile function."""
>       return compile(source, filename, symbol, self.flags | PyCF_ONLY_AST, 1)
E       MemoryError: Parser stack overflowed - Python source too complex to parse

core/compilerop.py:86: MemoryError
----------------------------- Captured stdout call -----------------------------
MemoryError: Parser stack overflowed - Python source too complex to parse

______________________________ test_unicode_range ______________________________

    def test_unicode_range():
        """
        Test that the ranges we test for unicode names give the same number of
        results than testing the full length.
        """
    
        expected_list = _unicode_name_compute([(0, 0x110000)])
        test = _unicode_name_compute(_UNICODE_RANGES)
        len_exp = len(expected_list)
        len_test = len(test)
    
        # do not inline the len() or on error pytest will try to print the 130 000 +
        # elements.
        message = None
        if len_exp != len_test or len_exp > 131808:
            size, start, stop, prct = recompute_unicode_ranges()
            message = f"""_UNICODE_RANGES likely wrong and need updating. This is
            likely due to a new release of Python. We've find that the biggest gap
            in unicode characters has reduces in size to be {size} characters
            ({prct}), from {start}, to {stop}. In completer.py likely update to
    
                _UNICODE_RANGES = [(32, {start}), ({stop}, 0xe01f0)]
    
            And update the assertion below to use
    
                len_exp <= {len_exp}
            """
        assert len_exp == len_test, message
    
        # fail if new unicode symbols have been added.
>       assert len_exp <= 143668, message
E       AssertionError: _UNICODE_RANGES likely wrong and need updating. This is
E                 likely due to a new release of Python. We've find that the biggest gap
E                 in unicode characters has reduces in size to be 711762 characters
E                 (78%), from 0x323b0, to 0xe0001. In completer.py likely update to
E         
E                     _UNICODE_RANGES = [(32, 0x323b0), (0xe0001, 0xe01f0)]
E         
E                 And update the assertion below to use
E         
E                     len_exp <= 148853
E                 
E       assert 148853 <= 143668

core/tests/test_completer.py:129: AssertionError
_______________________ test_interruptible_core_debugger _______________________

self = <IPython.core.debugger.InterruptiblePdb object at 0x7f6de8649550>
context = 0

    def print_stack_trace(self, context=None):
        Colors = self.color_scheme_table.active_colors
        ColorsNormal = Colors.Normal
        if context is None:
            context = self.context
        try:
            context = int(context)
            if context <= 0:
>               raise ValueError("Context must be a positive integer")
E               ValueError: Context must be a positive integer

core/debugger.py:496: ValueError

The above exception was the direct cause of the following exception:

    def test_interruptible_core_debugger():
        """The debugger can be interrupted.
    
        The presumption is there is some mechanism that causes a KeyboardInterrupt
        (this is implemented in ipykernel).  We want to ensure the
        KeyboardInterrupt cause debugging to cease.
        """
        def raising_input(msg="", called=[0]):
            called[0] += 1
            assert called[0] == 1, "input() should only be called once!"
            raise KeyboardInterrupt()
    
        tracer_orig = sys.gettrace()
        try:
            with patch.object(builtins, "input", raising_input):
>               debugger.InterruptiblePdb().set_trace()

core/tests/test_debugger.py:235: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib64/python3.14/bdb.py:118: in trace_dispatch
    return self.dispatch_opcode(frame, arg)
/usr/lib64/python3.14/bdb.py:223: in dispatch_opcode
    self.user_opcode(frame)
/usr/lib64/python3.14/pdb.py:460: in user_line
    self.interaction(frame, None)
core/debugger.py:466: in interaction
    OldPdb.interaction(self, frame, tb_or_exc)
/usr/lib64/python3.14/pdb.py:640: in interaction
    self._cmdloop()
core/debugger.py:1119: in _cmdloop
    self.cmdloop()
core/debugger.py:1105: in cmdloop
    return OldPdb.cmdloop(self, intro=intro)
/usr/lib64/python3.14/cmd.py:149: in cmdloop
    stop = self.onecmd(line)
/usr/lib64/python3.14/pdb.py:878: in onecmd
    return getattr(self, command)(arg)
/usr/lib64/python3.14/pdb.py:1035: in _pdbcmd_print_frame_status
    self.print_stack_trace(0)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <IPython.core.debugger.InterruptiblePdb object at 0x7f6de8649550>
context = 0

    def print_stack_trace(self, context=None):
        Colors = self.color_scheme_table.active_colors
        ColorsNormal = Colors.Normal
        if context is None:
            context = self.context
        try:
            context = int(context)
            if context <= 0:
                raise ValueError("Context must be a positive integer")
        except (TypeError, ValueError) as e:
>               raise ValueError("Context must be a positive integer") from e
E               ValueError: Context must be a positive integer

core/debugger.py:498: ValueError
_______________________________ test_xmode_skip ________________________________

    @skip_win32
    def test_xmode_skip():
        """that xmode skip frames
    
        Not as a doctest as pytest does not run doctests.
        """
        import pexpect
        env = os.environ.copy()
        env["IPY_TEST_SIMPLE_PROMPT"] = "1"
    
        child = pexpect.spawn(
            sys.executable, ["-m", "IPython", "--colors=nocolor"], env=env
        )
        child.timeout = 15 * IPYTHON_TESTING_TIMEOUT_SCALE
    
        child.expect("IPython")
        child.expect("\n")
        child.expect_exact("In [1]")
    
        block = dedent(
            """
        def f():
            __tracebackhide__ = True
            g()
    
        def g():
            raise ValueError
    
        f()
        """
        )
    
        for line in block.splitlines():
            child.sendline(line)
            child.expect_exact(line)
        child.expect_exact("skipping")
    
        block = dedent(
            """
        def f():
            __tracebackhide__ = True
            g()
    
        def g():
            from IPython.core.debugger import set_trace
            set_trace()
    
        f()
        """
        )
    
        for line in block.splitlines():
            child.sendline(line)
            child.expect_exact(line)
    
>       child.expect("ipdb>")

core/tests/test_debugger.py:301: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect
    return self.expect_list(compiled_pattern_list,
/usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list
    return exp.expect_loop(timeout)
/usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop
    return self.timeout(e)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <pexpect.expect.Expecter object at 0x7f6de344fa50>
err = TIMEOUT('Timeout exceeded.')

    def timeout(self, err=None):
        spawn = self.spawn
    
        spawn.before = spawn._before.getvalue()
        spawn.after = TIMEOUT
        index = self.searcher.timeout_index
        if index >= 0:
            spawn.match = TIMEOUT
            spawn.match_index = index
            return index
        else:
            spawn.match = None
            spawn.match_index = None
            msg = str(spawn)
            msg += '\nsearcher: %s' % self.searcher
            if err is not None:
                msg = str(err) + '\n' + msg
    
            exc = TIMEOUT(msg)
            exc.__cause__ = None    # in Python 3.x we can use "raise exc from None"
>           raise exc
E           pexpect.exceptions.TIMEOUT: Timeout exceeded.
E           <pexpect.pty_spawn.spawn object at 0x7f6de864aa50>
E           command: /usr/bin/python3
E           args: ['/usr/bin/python3', '-m', 'IPython', '--colors=nocolor']
E           buffer (last 100 chars): b'\n    499 try:\r\n    500     skipped = 0\r\n\r\nValueError: Context must be a positive integer\r\n\r\nIn [7]: '
E           before (last 100 chars): b'\n    499 try:\r\n    500     skipped = 0\r\n\r\nValueError: Context must be a positive integer\r\n\r\nIn [7]: '
E           after: <class 'pexpect.exceptions.TIMEOUT'>
E           match: None
E           match_index: None
E           exitstatus: None
E           flag_eof: False
E           pid: 4339
E           child_fd: 17
E           closed: False
E           timeout: 60.0
E           delimiter: <class 'pexpect.exceptions.EOF'>
E           logfile: None
E           logfile_read: None
E           logfile_send: None
E           maxread: 2000
E           ignorecase: False
E           searchwindowsize: None
E           delaybeforesend: 0.05
E           delayafterclose: 0.1
E           delayafterterminate: 0.1
E           searcher: searcher_re:
E               0: re.compile(b'ipdb>')

/usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT
____________________________ test_where_erase_value ____________________________

    @skip_win32
    def test_where_erase_value():
        """Test that `where` does not access f_locals and erase values."""
        import pexpect
    
        env = os.environ.copy()
        env["IPY_TEST_SIMPLE_PROMPT"] = "1"
    
        child = pexpect.spawn(
            sys.executable, ["-m", "IPython", "--colors=nocolor"], env=env
        )
        child.timeout = 15 * IPYTHON_TESTING_TIMEOUT_SCALE
    
        child.expect("IPython")
        child.expect("\n")
        child.expect_exact("In [1]")
    
        block = dedent(
            """
        def simple_f():
             myvar = 1
             print(myvar)
             1/0
             print(myvar)
        simple_f()    """
        )
    
        for line in block.splitlines():
            child.sendline(line)
            child.expect_exact(line)
        child.expect_exact("ZeroDivisionError")
        child.expect_exact("In [2]:")
    
        child.sendline("%debug")
    
        ##
>       child.expect("ipdb>")

core/tests/test_debugger.py:564: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect
    return self.expect_list(compiled_pattern_list,
/usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list
    return exp.expect_loop(timeout)
/usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop
    return self.timeout(e)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <pexpect.expect.Expecter object at 0x7f6de9cdd160>
err = TIMEOUT('Timeout exceeded.')

    def timeout(self, err=None):
        spawn = self.spawn
    
        spawn.before = spawn._before.getvalue()
        spawn.after = TIMEOUT
        index = self.searcher.timeout_index
        if index >= 0:
            spawn.match = TIMEOUT
            spawn.match_index = index
            return index
        else:
            spawn.match = None
            spawn.match_index = None
            msg = str(spawn)
            msg += '\nsearcher: %s' % self.searcher
            if err is not None:
                msg = str(err) + '\n' + msg
    
            exc = TIMEOUT(msg)
            exc.__cause__ = None    # in Python 3.x we can use "raise exc from None"
>           raise exc
E           pexpect.exceptions.TIMEOUT: Timeout exceeded.
E           <pexpect.pty_spawn.spawn object at 0x7f6de395d450>
E           command: /usr/bin/python3
E           args: ['/usr/bin/python3', '-m', 'IPython', '--colors=nocolor']
E           buffer (last 100 chars): b'\n    499 try:\r\n    500     skipped = 0\r\n\r\nValueError: Context must be a positive integer\r\n\r\nIn [3]: '
E           before (last 100 chars): b'\n    499 try:\r\n    500     skipped = 0\r\n\r\nValueError: Context must be a positive integer\r\n\r\nIn [3]: '
E           after: <class 'pexpect.exceptions.TIMEOUT'>
E           match: None
E           match_index: None
E           exitstatus: None
E           flag_eof: False
E           pid: 4341
E           child_fd: 18
E           closed: False
E           timeout: 60.0
E           delimiter: <class 'pexpect.exceptions.EOF'>
E           logfile: None
E           logfile_read: None
E           logfile_send: None
E           maxread: 2000
E           ignorecase: False
E           searchwindowsize: None
E           delaybeforesend: 0.05
E           delayafterclose: 0.1
E           delayafterterminate: 0.1
E           searcher: searcher_re:
E               0: re.compile(b'ipdb>')

/usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT
_______________________ TestAstTransform2.test_run_cell ________________________

self = <IPython.core.tests.test_interactiveshell.TestAstTransform2 testMethod=test_run_cell>

    def test_run_cell(self):
        ip.run_cell("n = 2")
>       self.assertEqual(self.calls, [(2,)])
E       AssertionError: Lists differ: [] != [(2,)]
E       
E       Second list contains 1 additional elements.
E       First extra element 0:
E       (2,)
E       
E       - []
E       + [(2,)]

core/tests/test_interactiveshell.py:855: AssertionError
________________________ TestAstTransform2.test_timeit _________________________

self = <IPython.core.tests.test_interactiveshell.TestAstTransform2 testMethod=test_timeit>

    def test_timeit(self):
        called = set()
        def f(x):
            called.add(x)
        ip.push({'f':f})
    
        with tt.AssertPrints("std. dev. of"):
            ip.run_line_magic("timeit", "-n1 f(1)")
>       self.assertEqual(called, {(1,)})
E       AssertionError: Items in the first set but not the second:
E       1
E       Items in the second set but not the first:
E       (1,)

core/tests/test_interactiveshell.py:873: AssertionError
__________________________ test_render_signature_long __________________________

    def test_render_signature_long():
        from typing import Optional
    
        def long_function(
            a_really_long_parameter: int,
            and_another_long_one: bool = False,
            let_us_make_sure_this_is_looong: Optional[str] = None,
        ) -> bool: pass
    
        sig = oinspect._render_signature(
            signature(long_function),
            long_function.__name__,
        )
        expected = """\
    long_function(
        a_really_long_parameter: int,
        and_another_long_one: bool = False,
        let_us_make_sure_this_is_looong: Optional[str] = None,
    ) -> bool\
    """
    
>       assert sig == expected
E       AssertionError: assert 'long_functio...e,\n) -> bool' == 'long_functio...e,\n) -> bool'
E         
E         Skipping 116 identical leading characters in diff, use -v to show
E         - s_looong: Optional[str] = None,
E         + s_looong: str | None = None,
E           ) -> bool

core/tests/test_oinspect.py:589: AssertionError
__________________ test_debug_magic_passes_through_generators __________________

    @skip_win32
    def test_debug_magic_passes_through_generators():
        """
        This test that we can correctly pass through frames of a generator post-mortem.
        """
        import pexpect
        import re
        in_prompt = re.compile(br'In ?\[\d+\]:')
        ipdb_prompt = 'ipdb>'
        env = os.environ.copy()
        child = pexpect.spawn(sys.executable, ['-m', 'IPython', '--colors=nocolor', '--simple-prompt'],
                              env=env)
        child.timeout = 15 * IPYTHON_TESTING_TIMEOUT_SCALE
    
        child.expect(in_prompt)
    
        child.timeout = 2 * IPYTHON_TESTING_TIMEOUT_SCALE
    
        child.sendline("def f(x):")
        child.sendline("    raise Exception")
        child.sendline("")
    
        child.expect(in_prompt)
        child.sendline("gen = (f(x) for x in [0])")
        child.sendline("")
    
        child.expect(in_prompt)
        child.sendline("for x in gen:")
        child.sendline("    pass")
        child.sendline("")
    
        child.timeout = 10 * IPYTHON_TESTING_TIMEOUT_SCALE
    
        child.expect('Exception:')
    
        child.expect(in_prompt)
        child.sendline(r'%debug')
>       child.expect('----> 2     raise Exception')

terminal/tests/test_debug_magic.py:60: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect
    return self.expect_list(compiled_pattern_list,
/usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list
    return exp.expect_loop(timeout)
/usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop
    return self.timeout(e)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <pexpect.expect.Expecter object at 0x7f6ddada3e70>
err = TIMEOUT('Timeout exceeded.')

    def timeout(self, err=None):
        spawn = self.spawn
    
        spawn.before = spawn._before.getvalue()
        spawn.after = TIMEOUT
        index = self.searcher.timeout_index
        if index >= 0:
            spawn.match = TIMEOUT
            spawn.match_index = index
            return index
        else:
            spawn.match = None
            spawn.match_index = None
            msg = str(spawn)
            msg += '\nsearcher: %s' % self.searcher
            if err is not None:
                msg = str(err) + '\n' + msg
    
            exc = TIMEOUT(msg)
            exc.__cause__ = None    # in Python 3.x we can use "raise exc from None"
>           raise exc
E           pexpect.exceptions.TIMEOUT: Timeout exceeded.
E           <pexpect.pty_spawn.spawn object at 0x7f6de9f5ca50>
E           command: /usr/bin/python3
E           args: ['/usr/bin/python3', '-m', 'IPython', '--colors=nocolor', '--simple-prompt']
E           buffer (last 100 chars): b'\n    499 try:\r\n    500     skipped = 0\r\n\r\nValueError: Context must be a positive integer\r\n\r\nIn [5]: '
E           before (last 100 chars): b'\n    499 try:\r\n    500     skipped = 0\r\n\r\nValueError: Context must be a positive integer\r\n\r\nIn [5]: '
E           after: <class 'pexpect.exceptions.TIMEOUT'>
E           match: None
E           match_index: None
E           exitstatus: None
E           flag_eof: False
E           pid: 4413
E           child_fd: 57
E           closed: False
E           timeout: 40.0
E           delimiter: <class 'pexpect.exceptions.EOF'>
E           logfile: None
E           logfile_read: None
E           logfile_send: None
E           maxread: 2000
E           ignorecase: False
E           searchwindowsize: None
E           delaybeforesend: 0.05
E           delayafterclose: 0.1
E           delayafterterminate: 0.1
E           searcher: searcher_re:
E               0: re.compile(b'----> 2     raise Exception')

/usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT
_____________________________ test_eval_formatter ______________________________

    def test_eval_formatter():
        f = text.EvalFormatter()
>       eval_formatter_check(f)

utils/tests/test_text.py:208: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
utils/tests/test_text.py:167: in eval_formatter_check
    s = f.format("{[n//i for i in range(1,8)]}", **ns)
/usr/lib64/python3.14/string.py:190: in format
    return self.vformat(format_string, args, kwargs)
/usr/lib64/python3.14/string.py:194: in vformat
    result, _ = self._vformat(format_string, args, kwargs, used_args, 2)
/usr/lib64/python3.14/string.py:235: in _vformat
    obj, arg_used = self.get_field(field_name, args, kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <IPython.utils.text.EvalFormatter object at 0x7f6e02b196a0>
name = '0[n//i for i in range(1,8)]', args = ()
kwargs = {'__builtins__': {'ArithmeticError': <class 'ArithmeticError'>, 'AssertionError': <class 'AssertionError'>, 'Attribute...ributeError'>, 'BaseException': <class 'BaseException'>, ...}, 'b': 'café', 'n': 12, 'os': <module 'os' (frozen)>, ...}

    def get_field(self, name: str, args: Any, kwargs: Any) -> Tuple[Any, str]:
>       v = eval(name, kwargs)
E         File "<string>", line 1
E           0[n//i for i in range(1,8)]
E                  ^^^
E       SyntaxError: invalid syntax



https://docs.python.org/3.14/whatsnew/3.14.html

For the build logs, see:
https://copr-be.cloud.fedoraproject.org/results/@python/python3.14/fedora-rawhide-x86_64/08837226-ipython/

For all our attempts to build ipython with Python 3.14, see:
https://copr.fedorainfracloud.org/coprs/g/python/python3.14/package/ipython/

Testing and mass rebuild of packages is happening in copr.
You can follow these instructions to test locally in mock if your package builds with Python 3.14:
https://copr.fedorainfracloud.org/coprs/g/python/python3.14/

Let us know here if you have any questions.

Python 3.14 is planned to be included in Fedora 43.
To make that update smoother, we're building Fedora packages with all pre-releases of Python 3.14.
A build failure prevents us from testing all dependent packages (transitive [Build]Requires),
so if this package is required a lot, it's important for us to get it fixed soon.

We'd appreciate help from the people who know this package best,
but if you don't want to work on this now, let us know so we can try to work around it on our side.

Comment 1 Lumír Balhar 2025-04-01 14:24:48 UTC
Reported upstream.

Comment 2 Lumír Balhar 2025-04-14 12:13:15 UTC
With alpha 7, the issue seems to be much more serious:

114 files written
Build API docs finished.
python3 autogen_config.py
make: *** [Makefile:80: source/config/options/config-generated.txt] Segmentation fault (core dumped)

Comment 3 Lumír Balhar 2025-04-14 12:34:05 UTC
It seems that the segfault is caused by the old pyzmq built with alpha 6.

<mock-chroot> sh-5.2# PYTHONFAULTHANDLER=1 python3 autogen_config.py 
Fatal Python error: Segmentation fault

Current thread 0x00007f3b00432bc0 [python3] (most recent call first):
  File "/usr/lib64/python3.14/site-packages/zmq/sugar/version.py", line 57 in zmq_version
  File "/usr/lib64/python3.14/site-packages/zmq/error.py", line 171 in __init__
  File "/usr/lib64/python3.14/site-packages/zmq/error.py", line 200 in _check_version
  File "/usr/lib64/python3.14/site-packages/zmq/__init__.py", line 83 in <module>
  File "<frozen importlib._bootstrap>", line 491 in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 762 in exec_module
  File "<frozen importlib._bootstrap>", line 938 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1342 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1371 in _find_and_load
  File "<frozen importlib._bootstrap>", line 491 in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1314 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1371 in _find_and_load
  File "/usr/lib/python3.14/site-packages/jupyter_client/asynchronous/client.py", line 8 in <module>
  File "<frozen importlib._bootstrap>", line 491 in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 762 in exec_module
  File "<frozen importlib._bootstrap>", line 938 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1342 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1371 in _find_and_load
  File "/usr/lib/python3.14/site-packages/jupyter_client/asynchronous/__init__.py", line 1 in <module>
  File "<frozen importlib._bootstrap>", line 491 in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 762 in exec_module
  File "<frozen importlib._bootstrap>", line 938 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1342 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1371 in _find_and_load
  File "/usr/lib/python3.14/site-packages/jupyter_client/__init__.py", line 3 in <module>
  File "<frozen importlib._bootstrap>", line 491 in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 762 in exec_module
  File "<frozen importlib._bootstrap>", line 938 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1342 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1371 in _find_and_load
  File "/usr/lib/python3.14/site-packages/ipykernel/connect.py", line 12 in <module>
  File "<frozen importlib._bootstrap>", line 491 in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 762 in exec_module
  File "<frozen importlib._bootstrap>", line 938 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1342 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1371 in _find_and_load
  File "/usr/lib/python3.14/site-packages/ipykernel/__init__.py", line 7 in <module>
  File "<frozen importlib._bootstrap>", line 491 in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 762 in exec_module
  File "<frozen importlib._bootstrap>", line 938 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1342 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1371 in _find_and_load
  File "<frozen importlib._bootstrap>", line 491 in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1314 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1371 in _find_and_load
  File "/builddir/build/BUILD/ipython-8.32.0-build/ipython-8.32.0/docs/autogen_config.py", line 6 in <module>

Extension modules: zmq.backend.cython._zmq (total: 1)
Segmentation fault (core dumped)


Note You need to log in before you can comment on or make changes to this bug.