在 Python 2 中安全导入具有 Unicode 名称的模块
Safely Importing Modules With Unicode Names in Python 2
(Python 2.6)
我有一些代码可以根据客户端名称进行一些自定义。
它做这样的事情:
custom_module = __import__("some.module.company_inc")
只要我们的客户有纯 ascii 名称,这就可以正常工作。
我也想让这段代码对非 ascii 公司名称也能正常工作,例如
custom_module = __import__(u"some.module.unicóde_company_inc")
然而,__import__
只接受字节,所以我需要先对其进行编码。
__import__(u"some.module.unicóde_company_inc".encode(sys.getfilesystemencoding())
是否保证在所有系统上都能正常工作(当然假设文件系统编码支持“ó”)?这是正确的方法吗? (假设我不知道盒子使用的编码)
我对 linux 系统最感兴趣。 (但也很高兴知道非 linux)
严格来说,在某些情况下sys.getfilesystemencoding()
可以return None
(例如,如果LANG
未设置)。因此,回退到 "utf-8" 以允许这种(不太可能的)可能性可能会稍微安全一些:
encoding = sys.getfilesystemencoding() or 'utf-8'
这将涵盖 99.9% 的情况。对于其余部分,我只允许应用程序引发异常(因为这正是它的本质),然后通过适当的信息错误消息优雅地退出。
(Python 2.6)
我有一些代码可以根据客户端名称进行一些自定义。
它做这样的事情:
custom_module = __import__("some.module.company_inc")
只要我们的客户有纯 ascii 名称,这就可以正常工作。
我也想让这段代码对非 ascii 公司名称也能正常工作,例如
custom_module = __import__(u"some.module.unicóde_company_inc")
然而,__import__
只接受字节,所以我需要先对其进行编码。
__import__(u"some.module.unicóde_company_inc".encode(sys.getfilesystemencoding())
是否保证在所有系统上都能正常工作(当然假设文件系统编码支持“ó”)?这是正确的方法吗? (假设我不知道盒子使用的编码)
我对 linux 系统最感兴趣。 (但也很高兴知道非 linux)
严格来说,在某些情况下sys.getfilesystemencoding()
可以return None
(例如,如果LANG
未设置)。因此,回退到 "utf-8" 以允许这种(不太可能的)可能性可能会稍微安全一些:
encoding = sys.getfilesystemencoding() or 'utf-8'
这将涵盖 99.9% 的情况。对于其余部分,我只允许应用程序引发异常(因为这正是它的本质),然后通过适当的信息错误消息优雅地退出。