簡體   English   中英

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

[英]the importlib.import_module has strange behavior in python3.5

具有相對模塊名稱的importlib.import_module有時會失敗。

例如,我有一個這樣的包結構:

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

測試代碼如下:

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.5中,它將無法通過第一個測試:

$ 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=

在python3.6中,它可以工作:

$ python3 test_impl.py 
sys.version_info(major=3, minor=6, micro=4, releaselevel='final', serial=0)
import OK: module=.test1, pkg=test0
import OK: module=test0.test1, pkg=
import OK: module=.test1, pkg=test0
import OK: module=test0.test1, pkg=

這是預期的還是錯誤? 更新:Python2.7.12與3.6具有相同的行為。

文檔說:

importlib.import_module(name, package=None)

...

在版本3.3中更改:父程序包將自動導入。

因此,3.6.4行為正確,而3.5.2行為錯誤。 您似乎遇到了#30876 ,問題表明該問題已在版本5 micro即v3.5.5中修復。

歸功於 6號室的金庫來找到機票

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM