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

相关:

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

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

 

 

 

本文主要解释Python语言中的两个基本概念:

  • 当前工作目录(Current Working Directory, cwd)
  • 模块第一搜索路径

 

 

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

 

 

先说明下,本文是在Ubuntu22.04系统上操作的,Python语言为3.10版本。

 

 

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

 

 

 

 

1. 当前工作目录(Current Working Directory, cwd)

 

当前工作目录(Current Working Directory, cwd),又叫资源搜索目录,顾名思义这个cwd目录就是为了提供资源进行读写的,而在Python语言中这个cwd目录的应用场景也是更为简单,就是open函数中相对路径的起始路径。在Python语言中当前工作目录也可以用相对路径表示为 “.” 。

 

举例:

代码文件夹格式如下:

 

 

 

 

 

 

 

 

xxx.py 文件内容:

 

import os

print( os.getcwd() )
print( os.path.abspath('.') )


with open("yyy0/yyy1/yyy.py") as file:
    print( file.read() )


os.chdir("yyy0/yyy1")
print( os.getcwd() )
print( os.path.abspath('.') )


with open("yyy.py") as file:
    print( file.read() )

 

 

 

 

yyy.py 文件内容:

 

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

 

 

 

 

 

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

 

 

假设我们现在是在文件夹12345中执行命令:

python3 xxx0/xxx1/xxx.py

 

 

 

 

 

 

此时的当前工作目录CWD,也就是当前目录“.”,为 /home/devil/12345 , 我们以此目录为起始目录使用相对路径读取 yyy.py 文件内容,其相对路径为:yyy0/yyy1/yyy.py

 

 

同时我们也可以以当前工作目录(“.”)为起始点用相对路径"yyy0/yyy1"来切换当前的工作目录(“.”)为 “/home/devil/12345/yyy0/yyy1”

 

 

 

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

 

 

 

如果我们改变启动程序时所在的目录则当前工作目录cwd也是会改变的,如下面操作:

 

 

 

 

 

 

 

可以看到当前工作目录默认是为启动代码时所在的目录:

 

如果在目录/home/devil/12345下执行代码,执行命令为:python3 xxx0/xxx1/xxx.py ,则当前工作目录为 /home/devil/12345 ;

 

如果在目录/home/devil/12345/xxx0下执行代码,执行命令为:python3 xxx1/xxx.py ,则当前工作目录为 /home/devil/12345/xxx0 ;

 

同理,如果在目录/home/devil/12345/xxx0/xxx1下执行代码,执行命令为:python3 xxx.py ,则当前工作目录为 /home/devil/12345/xxx0/xxx1 。

 

 

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

 

 

由上我们可以看到当前工作目录cwd,也就是当前目录“.”是资源搜索目录,或者说是资源搜索时相对路径的起始路径;同时我们也可知道当前工作目录,cwd目录是可以进行操作改变的,改变后使用相对路径读取其他文件时其起始点也是进行变更的。

 

 

 

 

 

 

 

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

 

 

 

 

上面说的就是当前工作目录cwd,即当前目录“.”的含义及使用方法,下来我们看下模块搜索路径又是什么。

 

 

 

2. 模块搜索路径

有人又将其叫做import路径或导入路径,说的直白些就是那些可以通过import语句引入模块的路径。

 

模块第一搜索路径,也就是默认你代码所在项目的顶层目录,也就是你项目代码中所有import本项目中代码的起始路径,在Python中除了你本项目的顶层目录可以import同时Python语言自带库路径也是可以import的。

由 查看并添加python中库的搜索路径 ,可知Ubuntu下查看Python语言自带的库路径(import 路径):

 

命令:

 

python3 -m site

 

 

 

 

 

 

 

可以看到上面显示的一个路径以外的其他路径均为Python语言自带的系统库的路径,这些自带库路径下存放的都是Python语言自带的库函数和通过pip install等方式安装的库,而我们这里所要讲的的路径就是这里的非自带库路径,即模块第一搜索路径

 

在Python中我们可以使用 sys.path 语句查看当前的模块搜索路径。

 

 

顾名思义,模块第一搜索路径就是指import时首先寻找库模块的路径,如果是通过交互方式启动Python则该路径为启动命令时所在的路径,这里我们所要讨论的是非交互方式启动Python程序时。

 

 

以非交互方式启动Python代码,则模块第一搜索路径为启动文件所在的路径,也可以视作该路径为你的项目代码的顶层目录,我们修改上面的xxx.py文件,内容如下(文件夹下文件树结构不变):

 

 

import os
import sys


print( os.getcwd() )
print( os.path.abspath('.') )

print(sys.path)


with open("yyy0/yyy1/yyy.py") as file:
    print( file.read() )


os.chdir("yyy0/yyy1")
print( os.getcwd() )
print( os.path.abspath('.') )

print(sys.path)


with open("yyy.py") as file:
    print( file.read() )

 

 

 

 

 

 

使用 python3 xxx0/xxx1/xxx.py 命令启动,效果如下:

 

 

 

 

 

 

 

 

使用 python3 xxx1/xxx.py 命令启动,效果如下:

 

 

 

可以看到不论采用何种方式启动文件xxx.py,模块第一搜索路径均为xxx.py所在路径。由此可知,模块第一搜索路径是不会随着当前工作命令cwd的改变而改变的,且不论使用那种启动方式(模块启动方式除外,python -m ),模块第一搜索路径均为启动文件所在目录路径,该路径则为该程序运行时的顶层目录,也就是import本项目中模块的起始import路径。

 

 

 

 

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

 

 

 

既然在python项目中默认的模块第一搜索路径为启动文件所在目录路径,那么我们是否可以对其进行修改呢,或者添加新的模块搜索路径呢,具体的参看下文:

如何更改Python项目中的 模块搜索第一路径

 

 

 

 

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

 

 

 

另外说一点,在python的交互方式中由于第一模块搜索路径并不是使用绝对地址而是相对地址,而相对地址的根目录为当前工作目录,而当前工作目录是可以手动修改的,因此第一搜索模块也会随之更改的。

 

 

posted on 2022-06-27 20:14  Angry_Panda  阅读(2304)  评论(0编辑  收藏  举报

导航