[Python-checkins] bpo-39432: Implement PEP-489 algorithm for non-ascii "PyInit_*" symbol names in distutils (GH-18150)
Stefan Behnel
webhook-mailer at python.org
Tue Feb 4 10:24:39 EST 2020
https://github.com/python/cpython/commit/9538bc9185e934bee2bd5ae2cda2b2e92a61906d
commit: 9538bc9185e934bee2bd5ae2cda2b2e92a61906d
branch: master
author: Stefan Behnel <stefan_ml at behnel.de>
committer: GitHub <noreply at github.com>
date: 2020-02-04T07:24:30-08:00
summary:
bpo-39432: Implement PEP-489 algorithm for non-ascii "PyInit_*" symbol names in distutils (GH-18150)
Make it export the correct init symbol also on Windows.
https://bugs.python.org/issue39432
files:
A Misc/NEWS.d/next/Library/2020-01-23-16-08-58.bpo-39432.Cee6mi.rst
M Lib/distutils/command/build_ext.py
M Lib/distutils/tests/test_build_ext.py
diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py
index 38bb8fd93c278..1a9bd1200f823 100644
--- a/Lib/distutils/command/build_ext.py
+++ b/Lib/distutils/command/build_ext.py
@@ -689,7 +689,15 @@ def get_export_symbols(self, ext):
provided, "PyInit_" + module_name. Only relevant on Windows, where
the .pyd file (DLL) must export the module "PyInit_" function.
"""
- initfunc_name = "PyInit_" + ext.name.split('.')[-1]
+ suffix = '_' + ext.name.split('.')[-1]
+ try:
+ # Unicode module name support as defined in PEP-489
+ # https://www.python.org/dev/peps/pep-0489/#export-hook-name
+ suffix.encode('ascii')
+ except UnicodeEncodeError:
+ suffix = 'U' + suffix.encode('punycode').replace(b'-', b'_').decode('ascii')
+
+ initfunc_name = "PyInit" + suffix
if initfunc_name not in ext.export_symbols:
ext.export_symbols.append(initfunc_name)
return ext.export_symbols
diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py
index 52d36b2484f41..7e3eafa8ef231 100644
--- a/Lib/distutils/tests/test_build_ext.py
+++ b/Lib/distutils/tests/test_build_ext.py
@@ -304,6 +304,19 @@ def test_get_source_files(self):
cmd.ensure_finalized()
self.assertEqual(cmd.get_source_files(), ['xxx'])
+ def test_unicode_module_names(self):
+ modules = [
+ Extension('foo', ['aaa'], optional=False),
+ Extension('föö', ['uuu'], optional=False),
+ ]
+ dist = Distribution({'name': 'xx', 'ext_modules': modules})
+ cmd = self.build_ext(dist)
+ cmd.ensure_finalized()
+ self.assertRegex(cmd.get_ext_filename(modules[0].name), r'foo\..*')
+ self.assertRegex(cmd.get_ext_filename(modules[1].name), r'föö\..*')
+ self.assertEqual(cmd.get_export_symbols(modules[0]), ['PyInit_foo'])
+ self.assertEqual(cmd.get_export_symbols(modules[1]), ['PyInitU_f_gkaa'])
+
def test_compiler_option(self):
# cmd.compiler is an option and
# should not be overridden by a compiler instance
diff --git a/Misc/NEWS.d/next/Library/2020-01-23-16-08-58.bpo-39432.Cee6mi.rst b/Misc/NEWS.d/next/Library/2020-01-23-16-08-58.bpo-39432.Cee6mi.rst
new file mode 100644
index 0000000000000..21c4ba8620755
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-01-23-16-08-58.bpo-39432.Cee6mi.rst
@@ -0,0 +1 @@
+Implement PEP-489 algorithm for non-ascii "PyInit\_..." symbol names in distutils to make it export the correct init symbol also on Windows.
More information about the Python-checkins
mailing list