我无法从config/__init__.py
文件导入变量。
我的目录如下:
.
├── src
│ ├── config
│ │ ├── __init__.py
│ │ ├── base_config.py
│ │ ├── log_config.py
│ │ └── output_config.py
│ ├── script.py
在__init__.py
我from config.output_config import output_data
。此文件还包含一行BUCKET = ...
在我的output_config.py
文件中,我有from config import BUCKET
,它在函数output_data()
中使用。
在script.py
我import 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
文件我需要它。非常感谢帮助解决问题并理解与导入相关的结构化项目的最佳实践。谢谢!
答案 0 :(得分:2)
我想说变量BUCKET到另一个python文件或settings.py,如果它是一个设置或常量,因为你因为它而导致循环导入。
从评论中更新:
创建一个settings.py
或constants.py
文件并将设置/常量放在那里,并尝试避免__init__.py
中的任何导入,除非它是标准库导入以避免任何潜在的循环引用在进口。
要记住的一件事是,只要您导入该软件包中的任何模块,就会加载放入__init__.py
的任何内容,因此您需要小心放在那里并尝试保持简短。
答案 1 :(得分:0)
我也在pythonanywhere上使用Python 3.7收到了该错误消息。原来我已经上传了两次源模块,其中一个在我的用户文件夹中。模块只能放在项目文件夹中。