【VSCode,Python】一劳永逸的成功导入本地模组,PYTHONPATH的修改,与各种踩坑点

发布时间:2024年01月14日

【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 这个路径,也就导入失败了

查阅

发现

  • 导入本地模组,或者代码的基本原理是 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 怎么你了!
文章来源:https://blog.csdn.net/weixin_45775438/article/details/135587503
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。