【VSCode,Python】一劳永逸的成功导入本地模组,PYTHONPATH的修改
- 起因
- 查阅
- 发现
- 做法一 (推荐做)
- 做法二 (推荐必做)
- 踩坑点(必看)
起因
- 文件目录如下:
my_project/
|-- package1/
| |-- module1.py
|-- package2/
| |-- module2.py
|-- main.py
我想在 model2.py 中导入 model1.py
但是有如下要求:
- 直接在代码里写上
sys.path.append来让导入成功的话,不符合工程规范(想象你要把工程发到github上去…) - 使用相对导入,比如
from . import xxx,from .. import xxx,from ... import xxx,大大降低可读性,不符合工程规范 - 所以只能使用绝对导入,比如
from my_project.package1 import model1
但是报错No module,找不到my_project这个路径,也就导入失败了
查阅
- 非常好的两篇博客
- VScode中通过PYTHONPATH引入自定义模块终极方案
windows下VScode修改PYTHONPATH变量方便导入模块
但是我在服务器端测试均失败,在本地成功了,很诡异
发现
- 导入本地模组,或者代码的基本原理是
PYTHONPATH,是一个字符串的数组,可以如下查看或者添加:
import sys
print("PYTHONPATH:", sys.path)
sys.path.append("XXX")
- 如果你的其中一个
PYTHONPATH为'E:\\Repo\\NLP'
那么你可以使用如下代码导入
from aa.bb import xxx
其中 aa 是在 NLP文件夹下的子文件夹
bb 是在 aa 文件夹下的子文件夹
- 所以我们的目的是让
PYTHONPATH能获得我们的项目目录的上一层
这样就可以导入from my_project.aa import xxx了
做法一 (推荐做)
- 在
launch.json中添加PYTHONPATH这一行
{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "Python: Current File","type": "python","request": "launch","program": "${file}","console": "integratedTerminal","justMyCode": false,"env": {"PYTHONPATH":"${workspaceFolder};${env:PYTHONPATH}"}}]
}

如果你是第一次设置 launch.json,那么 Add Configuration,否则直接 Open 即可
- 【注意】【注意】【注意】【注意】【注意】
这样,使用F5运行是可以的,因为F5运行会使用launch.json
但是你console运行python bb.py仍然不行
做法二 (推荐必做)
- 打开
Settings,输入terminal.integrated.env,点击自己的操作系统下的那个Edit

- 同理,加上
PYTHONPATH那一行即可
{"git.openRepositoryInParentFolders": "never","terminal.integrated.enableMultiLinePasteWarning": false,"remote.SSH.remotePlatform": {"172.23.148.79": "linux"},"explorer.confirmDragAndDrop": false,"security.workspace.trust.untrustedFiles": "open","editor.unicodeHighlight.ambiguousCharacters": false,"terminal.integrated.env.windows": {"PYTHONPATH":"${workspaceFolder};${env:PYTHONPATH}"},
}
- 注:修改完
json之后记得保存,最好关闭 console 或者关闭VSCode再打开
直接就去运行,可能会失败。 - 这样,使用
console运行python bb.py就可以了
踩坑点(必看)
- 所以方法大差不差,为什么本地可以运行,服务器那边一开始跑不了呢…
因为服务器是Linux端
PYTHONPAT中间用 冒号 间隔,而不是 分号 间隔开不同的路径!!! - 所以如果你是
Linux端,务必写成
"PYTHONPATH":"${workspaceFolder}:${env:PYTHONPATH}",
- 不然,你就会发现你的
sys.path打印出来后,是/xxx/xxx;
这边多了个分号,你自然拿不到下面子目录的包了…
这个还贼难看出来,不好好 debug 是真一直一头雾水 - 问
chatgpt,说是python3.3以前是要创建__init__.py的,但现在是不需要也可以的。除此之外python的版本号貌似并不影响 - 顺带一提,
pyCharm里面可以自己设定根目录,大概率是没这个问题了。
VSCode怎么你了!