在Spyder中第二次导入库时出现KeyError / frozen importlib._bootstrap错误

31
我收到了一个

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

当我在Spyder中第二次从子文件夹导入库时出现错误,但第一次(重新启动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版本中,但之前也发生在spyder version 3.3.0-py36_1版本中。Python版本为3.6.4,Spyder通过anaconda安装和更新,“python_library”通过setup.py安装(setuptools版本为40.6.3,也出现在version 39.2.0-py36_0中)。

注意:同样的错误发生在问题How do I solve a KeyError when importing a python module?中,但该问题没有答案,并且没有标记为spyder相关。

5个回答

30

解决方案是子文件夹 tools 中没有空的 __init__.py 文件,只有在上层文件夹 python_library 中存在。添加一个 __init__.py 文件到 tools 中即可解决问题。


3

命令行:

touch your_python_file_directory/__init__.py

1

我曾经遇到过同样的错误,然后按照其他答案的建议进行了尝试,但是没有起作用。请查看下面的错误截图。

错误: enter image description here

然后我开始寻找这个文件,发现它存在于两个位置。

  __init__.py file was missing.

请检查您系统中安装python工具的两个位置,如果文件不存在,请从任何lib子文件夹中获取并放置。 enter image description here Lib enter image description here

1
当我遇到这个错误时,是因为我重构了我的项目并将所有的应用程序移到了一个名为“apps”的文件夹中。然后,我改变了my INSTALLED_APPS列表中应用程序的名称为“apps.***”。但是,我忘记了在TEMPLATES设置中有上下文处理器,其中我也需要将应用程序名称更改为“apps.***”。所以,如果有人处于同样的情况,请按Ctrl + F查找您提到应用程序的所有其他位置,并确保全名正确。

有没有一种方法可以根据命令行错误来分解它? 我认为这些文件使用了我的应用程序的旧名称,但我不知道它们在哪里。 文件“<冻结importlib._bootstrap>”,第994行,_gcd_import 文件“<冻结importlib._bootstrap>”,第971行,_find_and_load 文件“<冻结importlib._bootstrap>”,第941行,_find_and_load_unlocked - Nick
刚刚复制了错误信息,但是命令行错误和调试页面都没有提供有用的信息来确定错误来源。不过,在“异常值”字段中,调试页面确实显示了哪个应用程序导致了错误,但除此之外,似乎没有其他方法,只能在每个文件中查找。 - Tommy Wolfheart

0
一个对我有效的解决方案(针对类似错误)是:
问题:执行“import extra.good.best.sigma as sig”时出现KeyError“extra”。
解决方案:
  1. 运行以下代码: import extra as sig
  2. 然后运行以下代码: import extra.good as sig
  3. 然后运行以下代码: import extra.good.best as sig
  4. 最后运行以下代码: import extra.good.best.sigma as sig
最终,pycache文件夹的内容似乎会自动整理好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接