内容承接上文:

Python语言中当前工作目录(Current Working Directory, cwd)与模块搜索第一路径都是指什么???

上文中已经解释了当前工作目录cwd与模块搜索路径的区别,本文讲一下模块搜索路径的修改方法。

-----------------------------------------------------

1.  修改sys.path中的路径

因为sys.path存的是模块搜索路径,可以直接对其进行修改,该种方式不好的地方就是会破坏项目代码的原有结构

yyy.py 文件内容:

print("Thist is yyy.py file.")

xxx.py 文件内容:

import sys
import os print("修改前,模块搜索路径:")
print(sys.path) r_path = ".."+os.sep+".." # python中相对路径的根路径为当前工作目录
sys.path[0] = os.path.realpath(sys.path[0]+os.sep+r_path)
# print(sys.path[0]) print("修改后,模块搜索路径:")
print(sys.path) import yyy0
import yyy0.yyy1.yyy

运行结果:

可以看到通过修改sys.path可以实现模块搜索路径的修改。

=================================================

2.  创建.pth 文件

在python的模块搜索路径site-packages下创建以.pth为后缀的文件,并在.pth文件中写入你想要加入的模块搜索路径。该种方法只能添加模块搜索路径并不能更改,同时你需要找到site-packages路径然后在其中创建文件,步骤要繁琐一些,好处是不会破坏原始代码结构,该种方式可以作为调试项目子模块的方法来使用。

如何寻找site-packages路径呢,我们可以使用python3 -m site的命令来查找。

在Ubuntu22.04系统下原生python下寻找site-packages路径:

在Ubuntu22.04系统下aconda下寻找site-packages路径:

这里我们创建my.pth文件,内容如下:

/home/devil/12345

xxx.py文件内容修改如下:

import sys
import os print("当前,模块搜索路径:")
print(sys.path) import yyy0
import yyy0.yyy1.yyy

可以看到添加的路径排在了site-packages路径后面。

使用该种方式可以不破坏原有代码结构对子模块代码进行单独测试,对于项目开发来说还是很好用的,不足的地方就是配置起来比较繁琐一些。该种方法添加搜索路径后会一直生效,如果要清除该添加路径则需要重新修改.pth文件。

=======================================================

3. 设置PYTHONPATH环境变量

作为环境变量,我们可以在终端命令中设置PYTHONPATH环境变量也可以在vscode中通过env变量的方式设置该变量。注意该种方法必须在python启动之前设置该环境变量,如果启动后通过os.environ["PYTHONPATH"] 的方式设置该环境变量是无效的,是不会将该路径添加到模块搜索路径中的,原理就是python在启动的时候会查找是否有PYTHONPATH变量,如果有则将其加入到模块搜索路径中。

此时修改xxx.py文件内容如下:

import sys
import os print("当前,模块搜索路径:")
print(sys.path) import yyy0
import yyy0.yyy1.yyy

执行结果:

可以看到通过设置PYTHONPATH环境变量成功添加模块搜索路径,该路径排在第一路径之后。

使用该方法比较灵活,由于在终端中设置的环境变量其生命周期只在当前终端内因此也可以避免污染其他项目。而且如果我们使用vscode这样的编译器的化可以在launch.json文件进行较为方便的设置的。

给出自己定义的vscode下的launch.json文件内容:

{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: 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": true, "env": {"PYTHONPATH":"${workspaceFolder}"}
}
]
}

不使用vscode的项目配置执行xxx.py文件:

发现报错,然后通过vscode的环境配置来执行,按键F5:

可以看到在vscode中通过配置launch.json中环境变量PYTHONPATH可以方便的启动子模块内的代码并且保持模块搜索路径依旧具有顶层模块的路径。

====================================

4. python3 -m 的模块启动方式

该种方式是在启动时根据启动命令确定模块搜索路径。熟悉Java的同学可以回想下Java中执行包内代码时的启动方式,和这个python中的模块启动方式比较像。

文件夹结构不变,xxx.py文件内容:

import sys
import os print("当前,工作目录:")
print(os.getcwd())
print("当前,模块搜索路径:")
print(sys.path) import yyy0
import yyy0.yyy1.yyy

当前在'/home/devil/12345'目录下,执行命令为:

python3 -m xxx0.xxx1.xxx

结果:

当前在'/home/devil/12345/xxx0'目录下,执行命令为:

python3 -m xxx1.xxx

可以看到通过模块启动的方式启动python代码时其当前工作目录即为其模块搜索的第一路径。

该种方式使用起来最为简单,不过该种方法不能通过IDE的方式来启动,因此如果比较依赖可视化界面编程的同学就不能通过该种启动方式来设置模块搜索路径了,但是该种方式作为临时之用还是不错的,毕竟不用什么其他的设置即可运行。

===================================

相关内容:

[python]自问自答:python -m参数? ( python3.7 版本 )

查看并添加python中库的搜索路径

如何更改Python项目中的 模块搜索第一路径的更多相关文章

  1. Python项目中如何优雅的import

    Python项目中如何优雅的import 前言 之前有一篇关于Python编码规范的随笔, 但是写的比较杂乱, 因为提到了import语句, 在篇文章中, 我专门来讲Python项目中如何更好的imp ...

  2. 在 python 项目中如何记录日志

    一. 概述 写本文的目的是我在写 python 项目的时候需要记录日志,我忘记怎么处理了,每次都需要去网上查一遍,好记性不如烂笔头, 这里把查阅的内容记录下来,方便以后查找. python 项目中记录 ...

  3. python项目中requirements的巧用(一键导入所有安装包)

    一个Python 项目中可能安装很多安装包, 再次创建虚拟环境是需要重新安装的话很麻烦也费时间, 或者项目部署的时候避免重装, 可以将现有项目的所有安装包记录在requirements.txt 文件, ...

  4. Maven 项目中依赖的搜索顺序

    Maven 项目中依赖的搜索顺序 http://www.manongjc.com/article/13422.html 执行过程中使用 -e -X 查看详细的搜索地址: 1,中央仓库,这是默认的仓库 ...

  5. python 项目中包中__init__.py文件的作用

    开发python项目时,我遇到了一个这样的现象,当我新建一个pythonpackage时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么, ...

  6. Python项目中的单元测试

    引入 单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架. 单元测试与功能测试都是日常开发中必不可少的部分,本文演示了Python中unittest单元 ...

  7. [git]安装git-pylint-commit-hook提高python项目中的代码质量

    什么是'git-pylint-commit-hook' 我在工作中,团队为了保证代码和提高代码的质量,要求每个项目都要求安装git-pylint-commit-hook,它是个钩子,会在你提交代码到本 ...

  8. 生成指定python项目中所有的依赖文件

    一. pipreqs工具 这个工具的好处是可以通过对项目目录的扫描,自动发现使用了那些类库,自动生成依赖清单. 缺点是可能会有些偏差,需要检查并自己调整下. 安装: pip install pipre ...

  9. 由web项目中上传图片所引出的路径问题

    我在做javaweb项目的时候,有个项目中需要进行图片的上传,有次我重新部署项目后,发现之前上传的图片不见了,最后找出原因:图片上传在服务器目录上,而不是绝对路径,所以特别想弄清楚javaweb项目中 ...

  10. IDEA的maven项目中静态文件编译的路径问题(未测试)

    转自:http://www.cnblogs.com/signheart/p/6625126.html IDEA的maven项目中,默认源代码目录下的xml等资源文件并不会在编译的时候一块打包进clas ...

随机推荐

  1. python pymysql 数据库查询操作

    import pymysql db= pymysql.connect(host="", user='', database="", password='') c ...

  2. springcloud之FeignClient访问微服务接口缓慢

    springcloud之FeignClient访问微服务接口缓慢查询服务日志报错如下:Caused by: java.net.SocketTimeoutException: Read timed ou ...

  3. 面试官:Java中缓冲流真的性能很好吗?我看未必

    一.写在开头 上一篇文章中,我们介绍了Java IO流中的4个基类:InputStream.OutputStream.Reader.Writer,那么这一篇中,我们将以四个基类所衍生出来,应对不同场景 ...

  4. MoneyPrinterPlus:AI自动短视频生成工具,详细使用教程

    MoneyPrinterPlus是一款使用AI大模型技术,一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上的轻松赚钱工具. 之前有出过一期基本的介绍,但是后台收 ...

  5. Flutter 借助SearchDelegate实现搜索页面,实现搜索建议、搜索结果,解决IOS拼音问题

    搜索界面使用Flutter自带的SearchDelegate组件实现,通过魔改实现如下效果: 搜素建议 搜索结果,支持刷新和加载更多 IOS中文输入拼音问题 界面预览 拷贝源码 将SearchDele ...

  6. HDU2062题解 01背包而已

    RT,我就不解释了,题目连接http://acm.hdu.edu.cn/showproblem.php?pid=2602. 初学01背包的人可以做做 #include<iostream> ...

  7. 2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest AGHIJM 题解

    A. LaIS 设 \(dp_i\) 为到第 i 位的最长的 almost increasing 长度.可以发现,这个 \(dp_i\) 的转移只有从 \(a_j \leq a_i\) 的地方转移过去 ...

  8. Git配置环境变量

    由于学习需要装了git,使用终端查看版本号时 提示 'git' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 原因 因为没有配置Git环境变量 解决方法:配置环境变量 开始菜单=>设置 ...

  9. CF1523D Love-Hate

    抽象化题意: 一共有 \(m\) 个元素,给定 \(n\) 个集合,每个集合的元素不超过 \(15\) 个,求出一个元素个数最多的集合 \(S\) 是至少 \(\lceil \dfrac{n}{2} ...

  10. 搭建redis-sentinel(哨兵)

    1.先创建redis一主两从的配置文件 2.编辑配置文件 cat >> /data/8012/redis.conf <<EOF port 8012 daemonize yes ...