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的交互方式中由于第一模块搜索路径并不是使用绝对地址而是相对地址,而相对地址的根目录为当前工作目录,而当前工作目录是可以手动修改的,因此第一搜索模块也会随之更改的。

Python语言中当前工作目录(Current Working Directory, cwd)与模块搜索第一路径都是指什么???的更多相关文章
- C语言中关于对目录的操作
原文地址:C语言中关于对目录的操作 目录的操作不论是在嵌入式产品还是应用软件编程都是必不可少的,不同的开发语言可能略有不同,笔者主要是讨论在Linux平台下对目录的一系列操作: 1.获取当前目录操作: ...
- Python语言中各种进制相互转换
目录 Python语言中各种进制相互转换 将二进制.八进制.十进制的数分别转换成十进制的方法 将十进制转换成二进制.八进制.十六进制 Python语言中各种进制相互转换 本文参考自https://ww ...
- 确定当前Python环境中的site-packages目录位置
引入“搜索路径”这个概念是因为在使用import语句时,当解释器遇到import语句,如果模块在当前的搜索路径就会被导入. 搜索路径是一个解释器会先进行搜索的所有目录的列表. 那么python如何添加 ...
- Python语言中的关键字(自己做的读书笔记)
电脑配置:联想笔记本电脑 windows8系统 Python版本:2.7.8 本文章撰写时间:2015.1.1 作者:陈东陈 阅读说明: 1.本文都是先解释,后放图片: 2.文中斜体部分要么为需要输入 ...
- python语言中的编码问题
在编程的过程当中,常常会遇到莫名其妙的乱码问题.很多人选择出了问题直接在网上找答案,把别人的例子照搬过来,这是快速解决问题的一个好办法.然而,作为一个严谨求实的开发者,如果不从源头上彻底理解乱码产生的 ...
- .NET中的工作目录一览!
定义: 当前工作目录——进行某项操作的目的目录,会随着OpenFileDialog.SaveFileDialog等对象所确定的目录而改变. 当前执行目录——该进程从中启动的目录,即文件自身 ...
- 了解 Python 语言中的时间处理
python 语言对于时间的处理继承了 C语言的传统,时间值是以秒为单位的浮点数,记录的是从1970年1月1日零点到现在的秒数,这个秒数可以转换成我们日常可阅读形式的日期和时间:我们下面首先来看一下p ...
- python语言中的编码问题(续)
上文提到了python开发中非常重要的两处设置. 一个是编解码器的默认设置defaultencoding >>> import sys >>> sys.getdef ...
- Python语言中的按位运算
(转)位操作是程序设计中对位模式或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加 ...
- python 查看与更换工作目录
1. 进入python控制台 2. 查看工作路径,需要导入os包: import os 3. 查看工作路径的命令: os.getcwd() 4. 修改工作路径的命令: os.chdir("d ...
随机推荐
- 微信支付普通商户与AppID账号关联管理-授权
微信支付普通商户与AppID账号关联管理 二.名词解释 名词 释义 微信支付普通商户 公司企业.政府机关.事业单位.社会组织.个体工商户.个人卖家.小微商户.(微信支付商户接入指引) AppID 已通 ...
- Rust性能分析之测试及火焰图,附(lru,lfu,arc)测试
性能测试,在编写代码后,单元测试及性能测试是重要的验收点,好的性能测试可以让我们提前发现程序中存在的问题. 测试用例 在Rust中,测试通常有两部分,一部分是文档测试,一部分是模块测试. 通常我们在函 ...
- Maven配置阿里云镜像和本地仓库路径
配置阿里云镜像仓库 在settings > mirrors标签下添加以下内容 <!-- Aliyun Mirror --> <mirror> <id>alim ...
- Jmeter自动录制脚本
1.Jmeter配置 1.1新增一个线程组 1.2Jmeter中添加HTTP代理 1.3配置HTTP代理服务器 修改端口 修改Target Cintroller(目标控制器) 修改Grouping(分 ...
- Mybatis if判断中使用了Ognl关键字导致报错解决方法
mybatis xml中使用OGNL解析参数,如果直接使用了关键字则会导致解析失败. 常见的关键字有: 字段 mybatis关键字 bor (字符|)的英文 xor 字符^的英文 and 字符& ...
- Numpy技巧: 由label获得相等矩阵
Numpy技巧: 由label获得相等矩阵 假设Label为: [ABAC] , 如何方便的得到一个矩阵, 其元素i,j表示第i位和第j位相等呢? 先把Label复制扩展成: m,m 的 ...
- Meilisearch 安装和使用教程
如今搜索功能已成为几乎所有应用不可或缺的一部分.无论是电商平台.内容管理系统,还是企业内部知识库,用户都期待能够快速.准确地找到他们需要的信息.然而,传统的搜索解决方案往往面临着诸多挑战:响应速度慢. ...
- 在VisualStudio中WPF应用程序在打开窗体界面设计时报错<发生了未经处理的异常>的解决方法
在网上找了一个wpf的开源项目,在打开窗体,点击设计的时候,提示错误信息如下 System.Resources.MissingSatelliteAssemblyExceptionThe satelli ...
- MySQL 并发控制(锁得使用)
导读 并发问题:同一时刻进行读写,并发问题回引发数据不一致问题. 解决并发问题:MySQL采用了锁定机制去解决并发问题 锁的分类 MySQL使用两种锁机制去解决问题:共享锁和排他锁,也叫读锁或者写锁. ...
- 重磅来袭!MoneyPrinterPlus一键发布短视频到视频号,抖音,快手,小红书上线了
MoneyPrinterPlus开源有一段时间了,已经实现了批量短视频混剪,一键生成短视频等功能. 有些小伙伴说了,我批量生成的短视频能不能一键上传到视频号,抖音,快手,小红书这些视频平台呢?答案是必 ...
