【问题标题】:Unable to import module from another package无法从另一个包导入模块
【发布时间】:2019-07-03 09:48:42
【问题描述】:

我有这样的目录结构

conf
    __init__.py
    settings.py
    abc.conf
    def.conf
src
    main.py
    xyz.py

src 我选择不制作包,而是制作普通文件夹。 我正在尝试在 main.py 中导入 settings.py 文件并使用命令 python3 main.py

执行整个操作

我在 main.py 中的导入语句:import conf.settings

我得到的错误是No module named conf.settings,我无法理解它。

python 是否无法将 conf 识别为包?包可以包含 .py 文件以外的文件(在我的例子中是 .conf 文件)

【问题讨论】:

  • 上面写着from . import conf.settings SyntaxError: invalid syntax config.settings 上的标记。如果我稍后添加 init.py 文件会有什么不同吗? config 原本是一个文件夹,后来我觉得它更适合作为一个包。
  • 这个新的导入语句显示No module named conf,而我的 init 文件为空。我正在 src 文件夹中运行 python main.py 命令。
  • 您是否希望 Python 进入您当前工作目录的每个文件夹 upstream(即 src,因为您正在使用 python3 main.py 执行程序),检查所有__init__.py 并将它们添加到其导入模块解析路径?每次运行都会花费大量时间,更不用说它可能导致的所有可能的冲突/路径冲突。因此,您的选择是将 parent 文件夹添加到 Python 路径(PYTHONPATH 环境变量),在运行时更改 sys.path,或者,最简单和最推荐的方法 - 只需移动 @987654334 @到src

标签: python-3.x import python-packaging


【解决方案1】:

导入python时搜索当前目录和sys.path。由于您的 main.py 位于 src 文件夹中,因此无法看到 conf 包文件夹。幸运的是,您可以在运行时更新 sys.path

root
     conf
        __init__.py
        settings.py
     src
        main.py

因此,您可以在导入 conf 模块之前从 main.py 附加 sys.path。请尝试以下操作:

# main.py
import os, sys
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))

from conf import settings
...

另一种方法是直接更新 PYTHONPATH 并将路径添加到脚本根目录。

【讨论】:

  • 这是在当前目录之外导入模块的推荐方法还是只是这样做的一种技巧?
  • 这是合法的方式。
  • 您可以将conf 移动到src 内部,并完全避免更新sys.path,如果这是可以接受的话...
猜你喜欢
  • 2021-01-15
  • 2014-04-30
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2018-01-21
  • 1970-01-01
相关资源
最近更新 更多