【问题标题】:ModuleNotFoundError: No module named... importing from a sub-sub directoryModuleNotFoundError: No module named... 从子目录导入
【发布时间】:2020-05-24 10:57:23
【问题描述】:

我无法从从子文件夹导入模块的子文件夹导入模块。我正在使用 python 3.6。

文件夹的结构如下所示:

src
├── script.py
└── prepare_data
          ├── __init__.py
          ├── test.py      
          └── lib
               ├── aspect_extraction.py
               └── __init__.py

aspect_extraction.py 我愿意:

def aspect_extraction():
    print("ok this worked")

test.py 看起来像这样:

from lib.aspect_extraction import aspect_extraction
def test_func():
    aspect_extraction()

test_func()

script.py 看起来像这样:

from prepare_data.test import test_func
test_func()

当我运行pipenv run python src/script.py

File "/src/prepare_data/test.py", line 1, in <module>
from lib.aspect_extraction import aspect_extraction
ModuleNotFoundError: No module named 'lib'

奇怪的是,当我运行 pipenv run python src/prepare_data/test.py 时,它可以工作。

ok this worked

我无法确定问题所在...这与 python 版本有关吗?

【问题讨论】:

  • 您可以尝试将一个空的__init__.py 文件添加到src 文件夹并尝试运行命令pipenv run python src/script.py 吗?

标签: python import module subdirectory


【解决方案1】:

test.py 中的 import 语句在当前工作目录中查找 lib.aspect_extraction,即调用它的目录(通常是 script.py 所在的目录,但不是必须的)。最简单的解决方案(不是最好的):更改导入语句:

from prepare_data.lib.aspect_extraction import aspect_extraction
def test_func():
    aspect_extraction()

test_func()

您可以使用 os.getcwd() 检查当前的工作目录。这是您对导入的第一个参考。

您还可以使用 os.path.dirname(os.path.abspath(file)) 获取正在运行的 python 文件。在 script.py 和 test.py 中插入这些行来检查差异:

import os
WORK_DIR = os.getcwd()
THIS_FILE_DIR = os.path.dirname(os.path.abspath(__file__))
print('WORK_DIR', WORK_DIR)
print('THIS_FILE_DIR', THIS_FILE_DIR)

关于 python 在哪里寻找模块的信息:

"Python 要做的第一件事就是在 系统模块。这是之前所有模块的缓存 进口的。

如果在模块缓存中找不到该名称,Python 将继续 搜索内置模块列表。这些是来的模块 预装 Python,可在 Python 标准中找到 图书馆。如果在内置模块中仍未找到该名称,则 Python 然后在 sys.path 定义的目录列表中搜索它。 这个列表通常包括当前目录,它被搜索 首先。”

更多内容请关注https://realpython.com/absolute-vs-relative-python-imports/

希望这会有所帮助。

【讨论】:

  • 显式相对导入也适用于test.pyfrom .lib.aspect_extraction import aspect_extraction(注意lib 之前的前导点)。详情请见PEP 328
  • from prepare_data.lib.aspect_extraction 工作。谢谢!
猜你喜欢
  • 2020-10-03
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2021-03-13
  • 2022-12-27
  • 2022-12-27
相关资源
最近更新 更多