diff --git a/meta/lib/oeqa/selftest/cases/recipetool.py b/meta/lib/oeqa/selftest/cases/recipetool.py
index ca05e54593..54b7cb3a65 100644
--- a/meta/lib/oeqa/selftest/cases/recipetool.py
+++ b/meta/lib/oeqa/selftest/cases/recipetool.py
@@ -597,6 +597,7 @@ class RecipetoolCreateTests(RecipetoolBase):
         checkvars['LICENSE'] = 'BSD-3-Clause'
         checkvars['LIC_FILES_CHKSUM'] = 'file://LICENSE;md5=702b1ef12cf66832a88f24c8f2ee9c19'
         checkvars['SRC_URI[sha256sum]'] = 'c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a'
+        checkvars['PYPI_PACKAGE'] = None
         checkvars['PYPI_PACKAGE_SDIST'] = None
         inherits = ['python_setuptools_build_meta', 'pypi']
 
@@ -621,6 +622,7 @@ class RecipetoolCreateTests(RecipetoolBase):
         checkvars['LICENSE'] = 'GPL-3.0-only'
         checkvars['LIC_FILES_CHKSUM'] = 'file://LICENSE;md5=1ebbd3e34237af26da5dc08a4e440464'
         checkvars['SRC_URI[sha256sum]'] = '81f7c0c5559becc8049470d86046b36e96113637bcbe4753ecef06977c00245d'
+        checkvars['PYPI_PACKAGE'] = None
         checkvars['PYPI_PACKAGE_SDIST'] = None
         inherits = ['python_setuptools_build_meta', 'pypi']
 
@@ -644,6 +646,7 @@ class RecipetoolCreateTests(RecipetoolBase):
         checkvars['LICENSE'] = 'BSD-2-Clause'
         checkvars['LIC_FILES_CHKSUM'] = 'file://LICENSE.txt;md5=b11cf936853a71258d4b57bb1849a3f9'
         checkvars['SRC_URI[sha256sum]'] = 'ab9c8f1080391e231812d20abf2657a69ee35574563b1014414f953964a95fa3'
+        checkvars['PYPI_PACKAGE'] = None
         checkvars['PYPI_PACKAGE_SDIST'] = None
         inherits = ['python_setuptools_build_meta', 'pypi']
 
diff --git a/scripts/lib/recipetool/create.py b/scripts/lib/recipetool/create.py
index bf533a45cf..e0da96dea0 100644
--- a/scripts/lib/recipetool/create.py
+++ b/scripts/lib/recipetool/create.py
@@ -261,6 +261,14 @@ class RecipeHandler(object):
     def process(self, srctree, classes, lines_before, lines_after, handled, extravalues):
         return False
 
+    def cleanup(self, pn, pv, classes, extravalues):
+        '''
+        Called once the recipe name and version have been determined, so
+        that handlers can drop values from extravalues that turn out to
+        be redundant.
+        '''
+        pass
+
 
 def validate_pv(pv):
     if not pv or '_version' in pv.lower() or pv[0] not in '0123456789':
@@ -795,6 +803,9 @@ def create_recipe(args):
         if name_pv and not realpv:
             realpv = name_pv
 
+    for handler in handlers:
+        handler.cleanup(pn, realpv, classes, extravalues)
+
     handle_license_vars(srctree_use, lines_before, handled, extravalues, tinfoil.config_data)
 
     if not outfile:
diff --git a/scripts/lib/recipetool/create_buildsys_python.py b/scripts/lib/recipetool/create_buildsys_python.py
index 4fc96db7e8..0fc9b2b58c 100644
--- a/scripts/lib/recipetool/create_buildsys_python.py
+++ b/scripts/lib/recipetool/create_buildsys_python.py
@@ -180,7 +180,8 @@ class PythonRecipeHandler(RecipeHandler):
             if required_version and version != required_version:
                 raise Exception("Version specified using --version/-V (%s) and version specified in the url (%s) do not match" % (required_version, version))
             # PYPI_PACKAGE is optional if BPN looks like "python-<pypi_package>" or "python3-<pypi_package>" (see pypi.bbclass)
-            # but at this point we cannot know because because user can specify the output name of the recipe on the command line
+            # but at this point we cannot know because the user can specify the output name of the recipe on the command line,
+            # so it is set here and dropped later in cleanup() once the recipe name is known
             pypi_package = self.pypi_normalise(pypi_package)
             extravalues["PYPI_PACKAGE"] = pypi_package
             # Some sdists don't use normalised names, so check and set PYPI_PACKAGE_SDIST if needed
@@ -205,6 +206,25 @@ class PythonRecipeHandler(RecipeHandler):
         handled.append('url')
         return fetch_uri
 
+    def cleanup(self, pn, pv, classes, extravalues):
+        """
+        PYPI_PACKAGE is not needed if it matches the default derived from BPN (see pypi.bbclass)
+        """
+        if not pn or 'pypi' not in classes or not extravalues.get('PYPI_PACKAGE'):
+            return
+
+        bpn = pn
+        if bpn.endswith('-native'):
+            bpn = bpn[:-len('-native')]
+        if bpn.startswith('nativesdk-'):
+            bpn = bpn[len('nativesdk-'):]
+        for prefix in ('python-', 'python3-'):
+            if bpn.startswith(prefix):
+                bpn = bpn[len(prefix):]
+                break
+        if self.pypi_normalise(bpn) == extravalues['PYPI_PACKAGE']:
+            del extravalues['PYPI_PACKAGE']
+
     def handle_classifier_license(self, classifiers, existing_licenses=""):
 
         licenses = []
