importlib.import_module在python3.5中有奇怪的行为

时间:2018-04-12 03:43:33

标签: python python-3.x import

具有相对模块名称的substring有时会失败。

例如,我有一个像这样的包结构:

importlib.import_module

测试代码如下:

├── test0
│   ├── __init__.py
│   ├── test1.py
│   └── test2.py
├── test_impl.py

在Python3.5中,第一次测试失败:

import importlib
import sys
print(sys.version_info)
def test_imp_module(module_name, pkgname):
    try:
        _m = importlib.import_module(module_name, pkgname)
        print("import OK: module={}, pkg={}".format(module_name, pkgname))
    except Exception as e:
        print(e)

test_imp_module(".test1", "test0")
test_imp_module("test0.test1", "")
if __name__ == '__main__':
    test_imp_module(".test1", "test0")
    test_imp_module("test0.test1", "")

在python3.6中它可以工作:

$ python3 test_impl.py 
sys.version_info(major=3, minor=5, micro=2, releaselevel='final', serial=0)
Parent module 'test0' not loaded, cannot perform relative import
import OK: module=test0.test1, pkg=
import OK: module=.test1, pkg=test0
import OK: module=test0.test1, pkg=

这是预期还是错误? 更新:     Python2.7.12与3.6具有相同的行为。

1 个答案:

答案 0 :(得分:3)

docs说:

  

importlib.import_module(name, package=None)

     

...

     

在版本3.3中更改:自动导入父包。

因此,3.6.4行为是正确的,3.5.2行为是错误的。  你似乎正在点击#30876,问题是在版本5微修复,即v3.5.5。

finding the ticket的房间6中归功于 vaultah