1. 程式人生 > 實用技巧 >AttributeError: module 'inspect' has no attribute 'getmro' 特定檔名造成python tensorflow崩潰,例如inspect.py

AttributeError: module 'inspect' has no attribute 'getmro' 特定檔名造成python tensorflow崩潰,例如inspect.py

bug復現:

  • 在當前路徑下,新建一個inspect.py檔案,內容隨意。
  • 保持當前路徑,執行python,進入互動式程式
  • 執行import tensorflow 就會出現bug:

如果inspect.py檔案的內容有bug,那麼會報因為那個bug導致tensorflow無法執行。
eg1:inspect.py檔案只有一行import haha

(base) [root@VM-XXX-205-centos ~]# python
Python 3.8.3 (default, Jul  2 2020, 16:21:59) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/root/anaconda3/lib/python3.8/site-packages/tensorflow/__init__.py", line 34, in <module>
    import inspect as _inspect
  File "/root/inspect.py", line 1, in <module>
    import haha
ModuleNotFoundError: No module named 'haha'

如果inspect.py檔案的內容沒bug,由於替換了tensorflow自己的inspect檔案,也會報錯。
eg2:inspect.py檔案只有一行pass

(base) [root@VM-197-205-centos ~]# python
Python 3.8.3 (default, Jul  2 2020, 16:21:59) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/root/anaconda3/lib/python3.8/site-packages/tensorflow/__init__.py", line 41, in <module>
    from tensorflow.python.tools import module_util as _module_util
  File "/root/anaconda3/lib/python3.8/site-packages/tensorflow/python/__init__.py", line 40, in <module>
    from tensorflow.python.eager import context
  File "/root/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/context.py", line 32, in <module>
    from tensorflow.core.framework import function_pb2
  File "/root/anaconda3/lib/python3.8/site-packages/tensorflow/core/framework/function_pb2.py", line 7, in <module>
    from google.protobuf import descriptor as _descriptor
  File "/root/anaconda3/lib/python3.8/site-packages/google/protobuf/__init__.py", line 37, in <module>
    __import__('pkg_resources').declare_namespace(__name__)
  File "/root/anaconda3/lib/python3.8/site-packages/pkg_resources/__init__.py", line 3257, in <module>
    def _initialize_master_working_set():
  File "/root/anaconda3/lib/python3.8/site-packages/pkg_resources/__init__.py", line 3240, in _call_aside
    f(*args, **kwargs)
  File "/root/anaconda3/lib/python3.8/site-packages/pkg_resources/__init__.py", line 3269, in _initialize_master_working_set
    working_set = WorkingSet._build_master()
  File "/root/anaconda3/lib/python3.8/site-packages/pkg_resources/__init__.py", line 573, in _build_master
    ws = cls()
  File "/root/anaconda3/lib/python3.8/site-packages/pkg_resources/__init__.py", line 566, in __init__
    self.add_entry(entry)
  File "/root/anaconda3/lib/python3.8/site-packages/pkg_resources/__init__.py", line 622, in add_entry
    for dist in find_distributions(entry, True):
  File "/root/anaconda3/lib/python3.8/site-packages/pkg_resources/__init__.py", line 1980, in find_distributions
    finder = _find_adapter(_distribution_finders, importer)
  File "/root/anaconda3/lib/python3.8/site-packages/pkg_resources/__init__.py", line 3169, in _find_adapter
    types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob))))
AttributeError: module 'inspect' has no attribute 'getmro'

應該是tensorflow初始化的時候會載入一個存在於python自己系統路徑的inspect.py指令碼,但是檢測到當前路徑下也有inspect.py,就優先使用當前路徑下的inspect.py了。
猛一看報錯資訊真是一臉懵逼,interesting 的 bug...