1. ホーム
  2. python

[解決済み] KeyError / フリーズしたimportlib._bootstrapがspyderの2つ目のライブラリインポートでエラーになる。

2022-02-16 07:07:59

質問

を受け取る。

File " <frozen importlib._bootstrap_external> ", line 978, in _get_parent_path    
KeyError: 'python_library'

2回目にspyderでサブフォルダからライブラリをインポートするとエラーが発生するが、1回目(spyderを再起動した後)またはspyderの外では正常に動作する。

そのコードとは

from python_library.tools.test_lib import test_func    
test_func()

ここで、test_lib.pyは単に

def test_func():    
    print('Hello!')

そして、その出力は

runfile('/home/user/Desktop/test.py', wdir='/home/user/Desktop')
Hello!

runfile('/home/user/Desktop/test.py', wdir='/home/user/Desktop')    
Reloaded modules: python_library, python_library.tools.test_lib
Traceback (most recent call last):

  File "< ipython-input-2-e750fd08988c >", line 1, in <module>   
    runfile('/home/user/Desktop/test.py', wdir='/home/user/Desktop')

  File "/home/user/anaconda3/envs/qutip/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py", line 678, in runfile    
    execfile(filename, namespace)

  File "/home/user/anaconda3/envs/qutip/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py", line 106, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/home/user/Desktop/test.py", line 1, in <module>
    from python_library.tools.test_lib import test_func

  File "<frozen importlib._bootstrap>", line 971, in _find_and_load

  File "<frozen importlib._bootstrap>", line 951, in _find_and_load_unlocked

  File "<frozen importlib._bootstrap>", line 894, in _find_spec

  File "<frozen importlib._bootstrap_external>", line 1157, in find_spec

  File "<frozen importlib._bootstrap_external>", line 1123, in _get_spec

  File "<frozen importlib._bootstrap_external>", line 994, in __iter__

  File "<frozen importlib._bootstrap_external>", line 982, in _recalculate

  File "<frozen importlib._bootstrap_external>", line 978, in _get_parent_path

KeyError: 'python_library'

ライブラリがサブフォルダにない場合、エラーは発生しません。

from python_library.test_lib2 import test_func

は任意の頻度で実行されます。しかし、サブフォルダがないのは非常に困るほどの機能があります。

これはspyder-3.3.2でのことですが、それ以前のバージョン3.3.0-py36_1でも発生しました。python のバージョンは 3.6.4 で、spyder は anaconda 経由でインストール・更新し、「python_library」は setup.py (setuptools バージョン 40.6.3, バージョン 39.2.0-py36_0 でも発生しました) でインストールされました。

注:同じエラーが発生したのは、問題の Python モジュールのインポート時に発生する KeyError を解決するにはどうすればよいですか? しかし、この質問には答えがなく、また、spyderタグもありません。

どのように解決するのですか?

解決策は、空の __init__.py ファイルは tools サブフォルダ内にあり、python_library スーパーフォルダ内にのみあります。ファイルを追加する __init__.py をtoolsに入れるとうまくいきました。