内容承接上文:
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的方式来启动,因此如果比较依赖可视化界面编程的同学就不能通过该种启动方式来设置模块搜索路径了,但是该种方式作为临时之用还是不错的,毕竟不用什么其他的设置即可运行。
===================================
相关内容: