起因
- 文件目录如下:
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
怎么你了!