使用sys.path.append后导入自定义模块失败,报ModuleNotFoundError如何解决?
问题解决:ModuleNotFoundError 修复及更优导入方法
1. 直接修复当前代码
你的错误在于sys.path.append添加的是文件路径而非目录路径。Python需要识别模块所在的目录,而非具体的.py文件。修改代码如下:
#! /usr/bin/env python3 import sys # 替换为模块所在的目录路径 sys.path.append('/Users/admin/Desktop/programming/pythonscripts') for i in sys.path: print(i) import myscript
修改后Python就能在指定目录下找到myscript.py模块并成功导入。
2. 更优的导入方法推荐
方法一:设置PYTHONPATH环境变量
将模块所在目录添加到系统的PYTHONPATH环境变量中,所有Python脚本会自动识别该目录下的模块,无需每次在代码中修改sys.path。
- Unix/Linux/macOS: 在终端执行以下命令(永久生效需添加到
~/.bashrc或~/.zshrc):export PYTHONPATH="/Users/admin/Desktop/programming/pythonscripts:$PYTHONPATH" - Windows: 在系统环境变量中新增PYTHONPATH变量,值为目标目录的绝对路径。
方法二:将目录转为Python包
在pythonscripts目录下创建空的__init__.py文件,将其转为Python包,之后可通过两种方式导入:
- 相对导入:若主脚本与
pythonscripts目录在同一父目录下,可使用:from pythonscripts import myscript - 可编辑安装:在
pythonscripts目录下创建pyproject.toml文件(内容如下),执行pip install -e .后即可全局导入该包:[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "pythonscripts" version = "0.1.0"
方法三:使用importlib.util动态导入
无需修改sys.path,直接通过文件路径导入模块:
import importlib.util module_path = '/Users/admin/Desktop/programming/pythonscripts/myscript.py' spec = importlib.util.spec_from_file_location('myscript', module_path) myscript = importlib.util.module_from_spec(spec) spec.loader.exec_module(myscript) # 调用模块内的函数/变量示例 myscript.your_function()
内容的提问来源于stack exchange,提问作者Abhijeet
相关产品推荐
相关产品推荐

