我无法从子文件夹中导入模块,该子文件夹从子子文件夹中导入模块。我正在使用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版本有关吗?
答案 0 :(得分:1)
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/中的更多内容
希望这会有所帮助。