将main.py移入子目录后Python模块导入失败求助
Python模块导入问题
项目结构
├── main.py └── tutorial_quickstart ├── __init__.py ├── data.py ├── neural_net.py ├── test.py └── train.py
原main.py导入代码
import torch from torch import nn from tutorial_quickstart.neural_net import NeuralNetwork from tutorial_quickstart.data import get_training_data from tutorial_quickstart.train import train from tutorial_quickstart.test import test
问题场景
将main.py移入tutorial_quickstart目录后,执行命令:
$ python tutorial_quickstart/main.py
出现以下错误:
❯ python tutorial_quickstart/main.py Traceback (most recent call last): File "/home/colin/code/chess-ml/tutorial_quickstart/main.py", line 3, in <module> from tutorial_quickstart.neural_net import NeuralNetwork ModuleNotFoundError: No module named 'tutorial_quickstart'
但在项目根目录执行python main.py时一切正常。
环境说明
使用WSL2、VSCode和Anaconda,已在项目目录内创建conda环境,并手动选择该环境下的Python解释器。
解决方案
方案1:改用相对导入
把main.py的导入语句改成相对路径形式,适配它在tutorial_quickstart包内的位置:
import torch from torch import nn from .neural_net import NeuralNetwork from .data import get_training_data from .train import train from .test import test
注意:直接运行main.py时会触发ImportError: attempted relative import with no known parent package,此时需要结合方案2的运行方式。
方案2:以包模块形式运行
保持原导入语句不变,在项目根目录执行以下命令:
python -m tutorial_quickstart.main
这种方式会自动将项目根目录加入Python的模块搜索路径,让解释器能识别tutorial_quickstart包。
方案3:手动添加根目录到搜索路径
在main.py开头添加代码,强制把项目根目录加入Python的搜索路径:
import sys import os # 获取当前文件所在目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 获取项目根目录(当前目录的上级目录) root_dir = os.path.dirname(current_dir) sys.path.append(root_dir) # 原导入语句保持不变 import torch from torch import nn from tutorial_quickstart.neural_net import NeuralNetwork from tutorial_quickstart.data import get_training_data from tutorial_quickstart.train import train from tutorial_quickstart.test import test
该方法不受运行路径限制,无论从哪个位置执行main.py都能正常导入模块。
内容的提问来源于stack exchange,提问作者Colin Cheung
相关产品推荐
相关产品推荐

