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

【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 怎么你了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/622070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【26 预处理详解】

目录 预定义符号#define定义常量#define定义宏带有副作用的宏参数宏替换的规则宏函数的对比#和##命名约定#undef命令行定义条件编译头文件的包含其他预处理指令 1. 预定义符号 c语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理…

LeetCode-1672/1572/54/73

1.最富有客户的资产总量(1672) 题目描述: 给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i​​​​​​​​​​​​ 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。 客户的 资产总…

Python自动化测试框架【生成测试报告】

如何才能让用例自动运行完之后,生成一张直观可看易懂的测试报告呢? 小编使用的是unittest的一个扩展HTMLTestRunner 环境准备 使用之前,我们需要下载HTMLTestRunner.py文件 点击HTMLTestRunner后进入的是一个写满代码的网页,小…

如何正确使用数据库读写分离

背景 在应用系统发展的初期,我们并不知道以后会发展成什么样的规模,所以一开始不会考虑复杂的系统架构,复杂的系统架构费时费力,开发周期长,与系统发展初期这样的一个定位是不吻合的。所以,我们都会采用简…

三菱FX系列PLC定长切割控制(线缆裁切)

三菱PLC绝对定位指令DDRVA实现往复运动控制详细介绍请查看下面文章链接: https://rxxw-control.blog.csdn.net/article/details/135570157https://rxxw-control.blog.csdn.net/article/details/135570157这篇博客我们介绍线缆行业的定长切割控制相关算法。 1、输送…

GSTAE

缺失数据的流量预测:一种多任务学习方法 摘要:基于真实交通数据的交通速度预测是智能交通系统(ITS)中的一个经典问题。大多数现有的交通速度预测模型都是基于交通数据完整或具有罕见缺失值的假设而提出的。然而,由于各种人为和自然因素,在现实场景中收集的此类数据往往是…

MySQl Mybatis

一、MySQL 1.1 概述 1.1.1 MySQL安装 1.1.2 数据模型 1.1.3 SQL简介 1.2 DDL 1.2.1 数据库操作 1.2.2 图形化工具 1.2.3 表结构操作 (一)创建 (二)数据类型 (1)数值类型 age tinyint unsigned——加上…

Page 251~254 Win32 GUI项目

win32_gui 源代码&#xff1a; #if defined(UNICODE) && !defined(_UNICODE)#define _UNICODE #elif defined(_UNICODE) && !defined(UNICODE)#define UNICODE #endif#include <tchar.h> #include <windows.h>/* Declare Windows procedure */…

开源知识库zyplayer-doc部署指南

1.前置条件 docker已经安装 mysql已经安装且数据库zyplayer-doc存在 服务器ip:192.168.168.99/ 数据库账户:root,密码:123456 2.拉取镜像 docker pull zyplayer/zyplayer-doc:latest 3.启动 docker run -d \--restart unless-stopped \--name zyplayer-doc \-p 8083:8083 …

常用的排序算法

该文章笔记结合菜鸟教程的排序算法&#xff0c;如果后面认识有改动或者完善再继续 最近笔试很多题目都考察过了基本的排序算法&#xff0c;尤其是快排、冒泡、选择&#xff0c;大家在这一方面一定要注意下。 一. 总述 1. 时间复杂度 详细介绍 1. 冒泡排序 冒泡排序重复地走…

看完这篇带你了解大学生必考安全证书NISP详解

NISP证书详解 NISP证书介绍&#xff1a;NISP证书等级&#xff1a;NISP&#xff08;一级&#xff09;报名&#xff1a;NISP&#xff08;一级&#xff09;课程大纲&#xff1a;NISP&#xff08;二级&#xff09;报名NISP&#xff08;二级&#xff09;课程大纲NISP二级置换CISP指南…

开源6位半万用表硬件电路分析

开源6位半手持式万用表 这里用的LM399H参考源&#xff0c;单片机是STM32L152&#xff0c;里面还用了MACHXO2-1200FPGA。 万用表由两块PCB组成。 硬件组成部分 电源管理电路 电源用的是6-10V&#xff0c;电源管理部分&#xff0c;首先用来一个ADP5070芯片&#xff08;内部含有…

Container ansible disguises local ansible 【容器 ansible 伪装本地 ansible】

预备条件&#xff1a; ctr & crictl $ nerdctl & containerd install了解 kubespray 是什么 kubespray 包含 ansible、ansible-playbook命令以及通过kubespray项目安装kubernetes集群的介质。 nerdctl pull quay.io/kubespray/kubespray:v2.23.1 nerdctl save -o qu…

Spell.dbc

Spell.dbc&#xff08;3.3.5.12340&#xff09; 因篇幅较长&#xff0c;以表格文件形式展示 链接地址&#xff1a; Spell.dbc&#xff08;3.3.5.12340&#xff09; 附图&#xff1a;

数据结构学习 jz14剪绳子

关键词&#xff1a;数学 动态规划 快速幂 这道题其实是分为两题。 题目一&#xff1a; 这道题我是没有思路的&#xff0c;看了k神的答案才知道有数学的方法。 方法一&#xff1a; 数学&#xff1a;其实中间的推导我没看&#xff0c;我服了。 思路&#xff1a; 复杂度计算&…

逆变器之推挽谐振

首先把前级推挽电路分成几个模块&#xff1a;方波发生器、谐振LC、整流滤波以及负载。框图如下图所示&#xff1a; 分析前提&#xff1a;稳态 在推挽电路正常工作中&#xff0c;输入电压恒定、输出电流电压也恒定&#xff08;电源处于稳定的工作状态中&#xff09; 方波发生器…

C-操作符详解

1.进制转换 1.1 10进制转2进制 方法&#xff1a;短除法 1.2 2进制转换8进制 8进制的数字每⼀位是0~7的&#xff0c;0~7的数字&#xff0c;各⾃写成2进制&#xff0c;最多有3个2进制位就⾜够了&#xff0c;⽐如7的⼆进制是111&#xff0c;所以在2进制转8进制数的时候&#xf…

SQL语句详解一

概念 什么是 SQL&#xff1f;&#xff08;如果还未安装MySQL请参考此文章安装下&#xff09; Structured Query Language&#xff1a;结构化查询语言其实就是定义和操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方&#xff0c;称为"方言"。 SQ…

C语言常用库函数

1.C语言标准库函数 C语言标准库函数由15个头文件组成。 1.数学函数 数学计算是计算机最擅长的运算&#xff0c;计算机大部分运算方法都是基于数学计算执行的。C语言提供了很多用于数学计算的库函数&#xff0c;合理利用这些库函数&#xff0c;将对程序的编写和运行起到事半功…

第9章-第2节-Java中的反射机制

1、概念&#xff1a; 反射机制&#xff1a;是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意属性和方法&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为 java…