PyCharm中导入正常但终端运行报错:ModuleNotFoundError解决方案咨询
你的问题核心在于PyCharm和终端的Python模块搜索路径(sys.path)不一致:PyCharm自动把你的项目根目录(/Users/me/longpath/project/amlproject)添加到了Python的搜索路径里,所以它能识别pca_mixtures作为一个顶层模块;但终端运行时,Python默认只会把当前执行脚本的目录或者你执行命令的目录加入搜索路径,导致找不到这个模块。
下面是几种靠谱的解决方法,按推荐程度排序:
方法1:设置PYTHONPATH环境变量(最推荐,一劳永逸)
在终端里,把你的项目根目录(amlproject)加到PYTHONPATH里:
- 如果你用的是bash/zsh,在终端执行:
要是想让这个设置永久生效,可以把上面的命令加到你的export PYTHONPATH="/Users/me/longpath/project/amlproject:$PYTHONPATH"~/.bashrc或者~/.zshrc文件里,之后每次打开终端都会自动生效。 - 设置好之后,不管你在哪个目录,执行
python pca_mixtures/main.py或者进入pca_mixtures目录执行python main.py都能正常运行了。
方法2:在main.py开头手动添加路径
如果你不想改环境变量,可以在main.py的最顶部(import语句之前)加上这段代码,把项目根目录加到sys.path里:
import sys import os # 获取当前脚本所在目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 项目根目录是当前目录的上级目录(amlproject) project_root = os.path.dirname(current_dir) if project_root not in sys.path: sys.path.append(project_root)
这样不管你从哪个目录运行main.py,Python都能找到pca_mixtures模块了,同时PyCharm的代码提示也不会受影响。
方法3:用-m参数以模块方式运行
进入项目根目录(/Users/me/longpath/project/amlproject),然后用Python的-m参数来运行模块:
python -m pca_mixtures.main
这种方式会让Python把当前目录(项目根)作为模块搜索路径的一部分,就能正确识别pca_mixtures模块了,而且不需要改代码或者环境变量,适合临时运行。
另外补充一下:当初你用from pca_mixtures.funcs import PCAMixture是对的,这是绝对导入,比相对导入(from .funcs import PCAMixture)更稳定,尤其是在复杂项目里。只要解决了路径问题,既能保留PyCharm的代码提示,又能在终端正常运行。
内容的提问来源于stack exchange,提问作者Sahand

