ModuleNotFoundError:未命名模块...从子子目录导入

时间:2020-05-24 10:57:23

标签: python import module subdirectory

我无法从子文件夹中导入模块,该子文件夹从子子文件夹中导入模块。我正在使用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版本有关吗?

1 个答案:

答案 0 :(得分: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要做的第一件事是在 sys.modules。这是以前所有模块的缓存

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

https://realpython.com/absolute-vs-relative-python-imports/中的更多内容

希望这会有所帮助。