为什么PyCharm会将当前文件及父目录添加至sys.path?
这不是PyCharm缓存路径导致的,核心原因是PyCharm默认会自动把你的项目根目录添加到Python的模块搜索路径(sys.path)中,而终端运行Python脚本时遵循的是Python的原生默认行为,不会自动添加这个路径。
具体拆解说明:
PyCharm的运行逻辑:
当你在PyCharm中打开一个项目文件夹并运行其中的脚本时,它会自动将整个项目的根目录加入到sys.path里——你打印sys.path看到的「项目目录」就是这个操作的结果。
举个常见的项目结构例子:你的项目根目录/ ├─ trace_recursion.py └─ 子目录/ └─ 你的运行脚本.py你的脚本在子目录中,原本需要
sys.path.append("..")来把父目录(也就是项目根目录)加入搜索路径。但PyCharm已经提前帮你完成了这个操作,所以即使注释掉那行代码,from trace_recursion import trace依然能找到模块——因为模块所在的项目根目录已经在搜索路径里了。终端运行的差异:
在终端直接运行Python脚本时,Python只会默认把「当前执行脚本所在的目录」(或你执行python命令时的工作目录,具体取决于运行方式)加入sys.path。如果你的脚本在子目录中,父目录(项目根目录)不在搜索路径中,注释掉sys.path.append("..")自然会找不到模块,触发报错,这完全符合Python的原生行为。额外补充:
如果你想让终端运行也和PyCharm保持一致,可以手动设置PYTHONPATH环境变量(Windows终端里执行set PYTHONPATH=你的项目根目录路径),这样每次在终端运行Python时,项目根目录都会自动被加入sys.path,就不用手动写sys.path.append了。
内容的提问来源于stack exchange,提问作者Robin Andrews

