Python" ImportError:无法导入名称"问题

时间:2018-03-07 22:10:32

标签: python import importerror

我无法从config/__init__.py文件导入变量。

我的目录如下:

.
├── src
│   ├── config
│   │   ├── __init__.py
│   │   ├── base_config.py
│   │   ├── log_config.py
│   │   └── output_config.py
│   ├── script.py

__init__.pyfrom config.output_config import output_data。此文件还包含一行BUCKET = ...

在我的output_config.py文件中,我有from config import BUCKET,它在函数output_data()中使用。

script.pyimport config并致电config.output_data()

当我运行script.py时,出现以下错误:

Traceback (most recent call last):
  File ".../src/config/output_config.py", line 15, in <module>
    from config import BUCKET
  File ".../src/config/__init__.py", line 7, in <module>
    from config.output_config import output_data
  File ".../src/config/output_config.py", line 15, in <module>
    from config import BUCKET
ImportError: cannot import name 'BUCKET'

好像我的问题可能是污染名称空间(..并制作循环引用......?),但我不知道如何解决这个问题。我的理解是__init__.py文件最适合用于导入其他配置文件,但我不知道如何将变量BUCKET放入output_config.py文件我需要它。非常感谢帮助解决问题并理解与导入相关的结构化项目的最佳实践。谢谢!

2 个答案:

答案 0 :(得分:2)

我想说变量BUCKET到另一个python文件或settings.py,如果它是一个设置或常量,因为你因为它而导致循环导入。

从评论中更新:

创建一个settings.pyconstants.py文件并将设置/常量放在那里,并尝试避免__init__.py中的任何导入,除非它是标准库导入以避免任何潜在的循环引用在进口。

要记住的一件事是,只要您导入该软件包中的任何模块,就会加载放入__init__.py的任何内容,因此您需要小心放在那里并尝试保持简短。

答案 1 :(得分:0)

我也在pythonanywhere上使用Python 3.7收到了该错误消息。原来我已经上传了两次源模块,其中一个在我的用户文件夹中。模块只能放在项目文件夹中。