【问题标题】:Python "ImportError: cannot import name" issuePython“ImportError:无法导入名称”问题
【发布时间】:2018-03-07 22:10:32
【问题描述】:

我在从 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 configconfig.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 文件中。将不胜感激帮助解决问题并了解与导入相关的构建项目的最佳实践。谢谢!

【问题讨论】:

    标签: python import importerror


    【解决方案1】:

    我会说将变量 BUCKET 放到不同的 python 文件或 settings.py 中,如果它是一个设置或常量,因为您因此而在循环导入中招致。

    来自 cmets 的更新:

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

    要记住的一点是,每当您在该包中导入任何模块时,都会加载您放入 __init__.py 的任何内容,因此您需要小心放在那里的内容并尽量保持简短。

    【讨论】:

    • 感谢您的回复。我的后续行动是这样的常量应该在哪里生活? __init__.py 还有一堆从环境变量中导入的其他常量,如果可能的话,我希望所有“设置”的东西都在一起。
    • 创建一个 settings.py 或 constants.py 文件并将它们放在那里,并尽量避免该文件中的任何导入,除非它是标准库导入以避免任何潜在的对导入的循环引用。跨度>
    • 谢谢。我最终将其移至base_config.py,并且运行良好。根据您的建议,您通常将该 settings.py 文件放在 config 文件夹中吗?还是别的地方?
    • 我通常将常量放在 settings.py 文件中,但是有很多方法。还有一些不错的库,例如处理配置和参数解析的 openstack oslo.config。要记住的一件事是,每当您在该包中导入任何模块时,都会加载您放入 __init__.py 的任何内容,因此您需要小心放在那里的内容并尽量保持简短。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 2014-09-27
      • 2020-04-09
      • 2016-12-24
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多