簡體   English   中英

為什么此片段與import_module一起失敗?

[英]Why does this snippet with import_module fail?

以下代碼創建一個Python包abc ,然后嘗試導入它。 它失敗了,但是如果我在try / except里面注釋了import_module('a.b')行,就可以正常工作!

import os.path
from importlib import import_module
import os
import shutil
import sys

shutil.rmtree('a', ignore_errors=True)

os.makedirs('a')
with open('a/__init__.py', 'w'):
    pass

try:
    # it works if i comment out the following line!
    import_module('a.b')
    pass
except ImportError:
    pass
print(sys.modules.get('a'))

os.makedirs('a/b/c')

with open('a/b/__init__.py', "w"):
    pass

with open('a/b/c/__init__.py', "w"):
    pass

import_module('a.b.c')
print('ok')

當我在Mac(官方Python 3.6安裝)上運行它時,我得到:

<module 'a' from '/Users/chris1/Documents/a/__init__.py'>
Traceback (most recent call last):
  File "/Users/chris1/Documents/foo3.py", line 35, in <module>
    import_module('a.b.c')
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 978, in _gcd_import
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load
  File "<frozen importlib._bootstrap>", line 936, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 978, in _gcd_import
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load
  File "<frozen importlib._bootstrap>", line 948, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'a.b'

僅在我的Mac而不是Windows Python 3.6上會發生此問題。

在Mac上, import_module似乎在sys.modules添加a 我認為這可能與后來的導入失敗的原因有關。

看來importlib緩存ab導入失敗的結果。 當您嘗試導入abc時,即使您創建了ab ,它也已經認為ab不存在。 在嘗試再次導入之前,您必須從importlib包調用invalidate_caches()

參考: https : //docs.python.org/3/library/importlib.html#importlib.import_module

如果要動態導入自解釋程序開始執行以來創建的模塊(例如,創建了Python源文件),則可能需要調用invalidate_caches()以便導入系統注意到新模塊。

暫無
暫無

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

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