Python模块导入问题:同目录模块导入失败的原因与解决方法
Python模块导入失败的原因与解决办法
咱们先把问题的核心原因拆解清楚:
为什么移目录后导入失败?
Python找模块全靠sys.path这个搜索路径列表——当你运行脚本时,Python会把当前工作目录(就是你执行python命令时所在的文件夹)和一些系统默认路径加到这个列表里,然后只在这些路径里找要导入的模块。
- 之前两个文件都在
Python-Part目录下时,你肯定是在Python-Part里运行脚本,这时候sys.path包含了这个目录,自然能找到同目录的salute.py。 - 移到
Python-Part/Modules&Packages后,如果你还是在Python-Part目录下运行python Modules&Packages/my_module.py,sys.path里只有Python-Part,而salute.py在子文件夹里,Python根本搜不到它;就算你进了子文件夹运行,如果IDE的工作目录没同步切换,也会出现同样的问题。
几个实用的解决办法
根据你的使用场景选就行:
1. 切换到脚本所在目录运行
最直接的办法,打开终端先跳转到Modules&Packages文件夹,再运行脚本:
cd Python-Part/Modules&Packages python my_module.py
这时候Python会把当前目录(也就是salute.py所在的文件夹)加到sys.path里,自然能找到模块。
2. 手动给Python加搜索路径
如果不想每次都切换目录,可以在my_module.py开头加几行代码,主动把脚本所在目录加到sys.path里:
import sys import os # 获取当前脚本的绝对路径所在目录 script_folder = os.path.dirname(os.path.abspath(__file__)) # 把这个目录加入Python的搜索路径 sys.path.append(script_folder) # 后面正常导入就行 import salute from salute import fruits salute.say_hello('Rafi') print(fruits['name'])
不管你在哪个目录运行这个脚本,Python都能精准找到salute.py。
3. 把文件夹变成Python包(适合长期维护)
如果这个文件夹以后要放更多模块,推荐把它变成标准的Python包:
- 在
Modules&Packages目录下创建一个空的__init__.py文件(不用写任何代码,只是告诉Python这是个包); - 修改
my_module.py里的导入代码为相对导入:
from . import salute from .salute import fruits salute.say_hello('Rafi') print(fruits['name'])
- 回到
Python-Part目录,用包的方式运行脚本:
python -m Modules&Packages.my_module
用-m参数运行会让Python把Python-Part加入搜索路径,同时识别Modules&Packages为包,相对导入就能正常工作了。
内容的提问来源于stack exchange,提问作者user12662795
相关产品推荐
相关产品推荐

