注意:以下基於python 3.7.0
報錯示例:
Error importing optional module nbformat
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\Release\jsonschema\__init__.py", line 31, in <module>
from importlib import metadata
ImportError: cannot import name 'metadata' from 'importlib' (C:\ProgramData\Anaconda3\Lib\importlib\__init__.py)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\Release\_plotly_utils\optional_imports.py", line 28, in get_module
return import_module(name)
File "C:\ProgramData\Anaconda3\Lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "C:\Users\Administrator\Desktop\Release\nbformat\__init__.py", line 32, in <module>
from .validator import validate, ValidationError
File "C:\Users\Administrator\Desktop\Release\nbformat\validator.py", line 12, in <module>
from jsonschema import ValidationError
File "C:\Users\Administrator\Desktop\Release\jsonschema\__init__.py", line 33, in <module>
import importlib_metadata as metadata
File "C:\Users\Administrator\Desktop\Release\importlib_metadata\__init__.py", line 591, in <module>
__version__ = version(__name__)
File "C:\Users\Administrator\Desktop\Release\importlib_metadata\__init__.py", line 553, in version
return distribution(distribution_name).version
File "C:\Users\Administrator\Desktop\Release\importlib_metadata\__init__.py", line 526, in distribution
return Distribution.from_name(distribution_name)
File "C:\Users\Administrator\Desktop\Release\importlib_metadata\__init__.py", line 194, in from_name
raise PackageNotFoundError(name)
importlib_metadata.PackageNotFoundError: importlib_metadata
這是由importlib_metadata引發的PackageNotFoundError異常,查看importlib_metadata\__init__.py line 194:
@classmethod
def from_name(cls, name):
"""Return the Distribution for the given package name.
:param name: The name of the distribution package to search for.
:return: The Distribution instance (or subclass thereof) for the named
package, if found.
:raises PackageNotFoundError: When the named package's distribution
metadata cannot be found.
"""
for resolver in cls._discover_resolvers():
dists = resolver(DistributionFinder.Context(name=name))
dist = next(dists, None)
if dist is not None:
return dist
else:
raise PackageNotFoundError(name)
註釋中給出說明,當package的distribution metadata無法找到時,拋出PackageNotFoundError異常。
轉到Anaconda3\Lib\site-packages目錄,可以看到,每個包都會附帶一個以“-info”爲後綴的文件夾,如importlib_metadata,對應importlib_metadata-1.5.0.dist-info,上面的異常就是因爲缺少importlib_metadata-1.5.0.dist-info文件夾導致的,只要將該文件夾拷貝至importlib_metadata的相同目錄,就可以解決,而無需在python環境中pip安裝這個包。
同理,其他包缺少了相應的-info文件夾也會導致這個異常