Bug 2336910 - awscli2 fails to build with Python 3.14: ValueError('badly formed help string'), KeyError: 'PATH'
Summary: awscli2 fails to build with Python 3.14: ValueError('badly formed help string...
Keywords:
Status: CLOSED RAWHIDE
Alias: None
Product: Fedora
Classification: Fedora
Component: awscli2
Version: rawhide
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Nikola Forró
QA Contact:
URL:
Whiteboard:
Depends On:
Blocks: PYTHON3.14
TreeView+ depends on / blocked
 
Reported: 2025-01-10 12:46 UTC by Karolina Surma
Modified: 2025-03-25 13:57 UTC (History)
5 users (show)

Fixed In Version: awscli2-2.25.0-1.fc43
Clone Of:
Environment:
Last Closed: 2025-03-25 13:57:33 UTC
Type: Bug
Embargoed:


Attachments (Terms of Use)

Description Karolina Surma 2025-01-10 12:46:53 UTC
awscli2 fails to build with Python 3.14.0a3.

______________ TestCLIInputYAML.test_input_yaml_ignores_comments _______________
[gw0] linux -- Python 3.14.0 /usr/bin/python3

self = <tests.functional.test_cliinput.TestCLIInputYAML testMethod=test_input_yaml_ignores_comments>

    def test_input_yaml_ignores_comments(self):
        command = [
            's3api', 'list-objects-v2', '--cli-input-yaml',
            'Bucket: test-bucket # Some comment\nEncodingType: url'
        ]
>       self.assert_params_for_cmd(
            command, {'Bucket': 'test-bucket', 'EncodingType': 'url'}
        )

tests/functional/test_cliinput.py:133: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../BUILDROOT/usr/lib/python3.14/site-packages/awscli/testutils.py:441: in assert_params_for_cmd
    stdout, stderr, rc = self.run_cmd(cmd, expected_rc)
../BUILDROOT/usr/lib/python3.14/site-packages/awscli/testutils.py:480: in run_cmd
    self.assertEqual(
E   AssertionError: 255 != 0 : Unexpected rc (expected: 0, actual: 255) for command: ['s3api', 'list-objects-v2', '--cli-input-yaml', 'Bucket: test-bucket # Some comment\nEncodingType: url']
E   stdout:
E   stderr:
E   
E   badly formed help string
------------------------------ Captured log call -------------------------------
DEBUG    awscli.clidriver:clidriver.py:903 OrderedDict({'bucket': <awscli.arguments.CLIArgument object at 0x7fe1a02c9850>, 'delimiter': <awscli.arguments.CLIArgument object at 0x7fe1a63ebdd0>, 'encoding-type': <awscli.arguments.CLIArgument object at 0x7fe1a63e95d0>, 'max-keys': <awscli.arguments.CLIArgument object at 0x7fe1a63e8550>, 'prefix': <awscli.arguments.CLIArgument object at 0x7fe1a63e8dd0>, 'continuation-token': <awscli.arguments.CLIArgument object at 0x7fe1a63e90d0>, 'fetch-owner': <awscli.arguments.BooleanArgument object at 0x7fe1c64276a0>, 'no-fetch-owner': <awscli.arguments.BooleanArgument object at 0x7fe1c6426360>, 'start-after': <awscli.arguments.CLIArgument object at 0x7fe1a63e8150>, 'request-payer': <awscli.arguments.CLIArgument object at 0x7fe1a63e8650>, 'expected-bucket-owner': <awscli.arguments.CLIArgument object at 0x7fe1a63e94d0>, 'optional-object-attributes': <awscli.arguments.ListArgument object at 0x7fe1a63e8fd0>})
DEBUG    awscli.customizations.paginate:paginate.py:133 Modifying paging parameters for operation: ListObjectsV2
DEBUG    awscli.clidriver:clidriver.py:505 Exception caught in main()
Traceback (most recent call last):
  File "/usr/lib64/python3.14/argparse.py", line 1665, in _check_help
    formatter._expand_help(action)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "/usr/lib64/python3.14/argparse.py", line 604, in _expand_help
    return help_string % params
           ~~~~~~~~~~~~^~~~~~~~
ValueError: unsupported format character '%' (0x25) at index 957

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

Traceback (most recent call last):
  File "/builddir/build/BUILD/awscli2-2.22.10-build/BUILDROOT/usr/lib/python3.14/site-packages/awscli/clidriver.py", line 499, in main
    return command_table[parsed_args.command](remaining, parsed_args)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "/builddir/build/BUILD/awscli2-2.22.10-build/BUILDROOT/usr/lib/python3.14/site-packages/awscli/clidriver.py", line 634, in __call__
    return command_table[parsed_args.operation](remaining, parsed_globals)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/builddir/build/BUILD/awscli2-2.22.10-build/BUILDROOT/usr/lib/python3.14/site-packages/awscli/clidriver.py", line 793, in __call__
    operation_parser = self._create_operation_parser(
        self.arg_table, subcommand_table)
  File "/builddir/build/BUILD/awscli2-2.22.10-build/BUILDROOT/usr/lib/python3.14/site-packages/awscli/clidriver.py", line 920, in _create_operation_parser
    parser = ArgTableArgParser(arg_table, subcommand_table)
  File "/builddir/build/BUILD/awscli2-2.22.10-build/BUILDROOT/usr/lib/python3.14/site-packages/awscli/argparser.py", line 192, in __init__
    self._build(argument_table, command_table)
    ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/builddir/build/BUILD/awscli2-2.22.10-build/BUILDROOT/usr/lib/python3.14/site-packages/awscli/argparser.py", line 197, in _build
    argument.add_to_parser(self)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/builddir/build/BUILD/awscli2-2.22.10-build/BUILDROOT/usr/lib/python3.14/site-packages/awscli/arguments.py", line 432, in add_to_parser
    parser.add_argument(
    ~~~~~~~~~~~~~~~~~~~^
        cli_name,
        ^^^^^^^^^
        help=self.documentation,
        ^^^^^^^^^^^^^^^^^^^^^^^^
        type=self.cli_type,
        ^^^^^^^^^^^^^^^^^^^
        required=self.required)
        ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.14/argparse.py", line 1479, in add_argument
    self._check_help(action)
    ~~~~~~~~~~~~~~~~^^^^^^^^
  File "/usr/lib64/python3.14/argparse.py", line 1667, in _check_help
    raise ValueError('badly formed help string') from exc
ValueError: badly formed help string

______________ TestEMRutils.test_which_with_non_existing_command _______________
[gw1] linux -- Python 3.14.0 /usr/bin/python3

self = <tests.unit.customizations.emr.test_emr_utils.TestEMRutils object at 0x7f0087564550>

    def test_which_with_non_existing_command(self):
>       path = which('klajsflklj')

tests/unit/customizations/emr/test_emr_utils.py:24: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

program = 'klajsflklj'

    def which(program):
>       for path in os.environ["PATH"].split(os.pathsep):
E       KeyError: 'PATH'

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/08480126-awscli2/

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

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 Aoife Moloney 2025-02-26 13:22:07 UTC
This bug appears to have been reported against 'rawhide' during the Fedora Linux 42 development cycle.
Changing version to 42.


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