diff --git a/meta-python/recipes-extended/python-pykickstart/files/0005-options-adjust-to-behavior-change-in-upstream-_parse.patch b/meta-python/recipes-extended/python-pykickstart/files/0005-options-adjust-to-behavior-change-in-upstream-_parse.patch
new file mode 100644
index 0000000000..e2b34ab937
--- /dev/null
+++ b/meta-python/recipes-extended/python-pykickstart/files/0005-options-adjust-to-behavior-change-in-upstream-_parse.patch
@@ -0,0 +1,71 @@
+From f753d4d6ad1f4846d14735beb3d1b157b9914b51 Mon Sep 17 00:00:00 2001
+From: Adam Williamson <awilliam@redhat.com>
+Date: Wed, 2 Oct 2024 09:48:39 -0700
+Subject: [PATCH] options: adjust to behavior change in upstream
+ _parse_optional
+
+In Python 3.13 and 3.12.7, the behavior of _parse_optional has
+changed. It used to raise an error on multiple matching actions
+itself, and only ever return None or an option tuple. Now the
+"raise error on multiple matching actions" code was moved out
+into consume_optional, and _parse_optional returns either None
+or a *list* of option tuples, which contains more than one if
+multiple actions match. See:
+
+https://github.com/python/cpython/pull/124631
+https://github.com/python/cpython/issues/58573
+
+This adapts to the change in a way that should work on both older
+and newer Pythons.
+
+Signed-off-by: Adam Williamson <awilliam@redhat.com>
+
+Upstream-Status: Backport [https://github.com/pykickstart/pykickstart/commit/f753d4d]
+
+Signed-off-by: Kai Kang <kai.kang@windriver.com>
+---
+ pykickstart/options.py | 20 +++++++++++++++++---
+ 1 file changed, 17 insertions(+), 3 deletions(-)
+
+diff --git a/pykickstart/options.py b/pykickstart/options.py
+index 2e3a0721..ca0e18af 100644
+--- a/pykickstart/options.py
++++ b/pykickstart/options.py
+@@ -177,9 +177,23 @@ class KSOptionParser(ArgumentParser):
+         self.lineno = None
+ 
+     def _parse_optional(self, arg_string):
+-        option_tuple = ArgumentParser._parse_optional(self, arg_string)
++        # Before 3.13 and 3.12.7, this returned None or a single
++        # option tuple. From 3.13 / 3.12.7 onwards it returns None
++        # or a *list* of option tuples
++        option_tuple_or_tuples = ArgumentParser._parse_optional(self, arg_string)
++        # all we want to do here is a custom warning if the action is
++        # deprecated. we can only safely do this if there's exactly
++        # one matching action
++        if isinstance(option_tuple_or_tuples, list):
++            if len(option_tuple_or_tuples) == 1:
++                option_tuple = option_tuple_or_tuples[0]
++            else:
++                return option_tuple_or_tuples
++        else:
++            option_tuple = option_tuple_or_tuples
++
+         if option_tuple is None or option_tuple[0] is None:
+-            return option_tuple
++            return option_tuple_or_tuples
+ 
+         action = option_tuple[0]
+         option = action.option_strings[0]
+@@ -191,7 +205,7 @@ class KSOptionParser(ArgumentParser):
+                             "kickstart. Please modify your kickstart file to remove this option.")
+                           % {"lineno": self.lineno, "option": option}, KickstartDeprecationWarning)
+ 
+-        return option_tuple
++        return option_tuple_or_tuples
+ 
+     def add_argument(self, *args, **kwargs):
+         if "introduced" in kwargs:
+-- 
+2.47.1
+
diff --git a/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.48.bb b/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.48.bb
index 953068f7c3..657d0df539 100644
--- a/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.48.bb
+++ b/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.48.bb
@@ -17,6 +17,7 @@ SRC_URI = "git://github.com/rhinstaller/pykickstart.git;protocol=https;branch=ma
            file://0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch \
            file://0003-comment-out-sections-shutdown-and-environment-in-gen.patch \
            file://0004-load.py-retry-to-invoke-request-with-timeout.patch \
+           file://0005-options-adjust-to-behavior-change-in-upstream-_parse.patch \
            "
 SRCREV = "fa6c80c0e5c6bee29d089899a10d26e6f7f8afd8"
 
