Python 运行时的目录信息

摘要说明:

在 python 执行过程中,会涉及各种目录信息,了解各种目录的含义和获取方式,可以让我们更好地进行代码控制,并进行相应的处理。

一. 操作场景说明

1. 几个目录和文件

  1. Windows的命令行窗口所在目录 : c:\workspace
  2. python 的解释器执行文件: c:\env\python.exe
  3. python 的源代码启动文件: c:\source\main.py

2. 操作步骤

  1. 在Windows操作系统中,打开一个 Command 命令窗口
  2. CD c:\workspace, 进入目录 c:\workspace
  3. c:\workspace 命令行窗口中, 运行命令: c:\env\python.exe c:\source\main.py

3. 目录信息

在以上python 运行状态下, 需要理解其中存在的3个目录信息,

  1. 当前的工作目录 : c:\workspace\
  2. 当前 Python 系统的安装目录 : c:\env\
  3. 当前 Python 项目的启动根目录 : c:\source\

二. Python 目录的理解和处理

1. 当前的工作目录

  • 内置模块 os , 指的是操作系统,通过 os.getcwd(), 可获得当前运行状态下的工作目录
  • 改变当前工作目录,可用 os.chdir()
  • os 对相对路径的操作,是以当前的工作目录为主目录进行处理的,比如 os.mkdir()

2. 当前项目的启动根目录

  • 在项目启动文件中

通过**file**, 可获得项目启动文件全称文件名

通过 os.path.dirname(file) , 可获得项目启动根目录

  • 在项目任何文件中

通过 sys.argv[0], 可获得项目启动文件全称文件名

通过 os.path.dirname(sys.argv[0]) , 可获得项目启动根目录

  • 当前 Python 项目的启动根目录,将会自动加入到 sys.path 中的第1个查找元素位置,即 sys.path = 项目启动根目录 + 其他 sys.path

  • 大部分情况下,会先进入 python 项目启动文件所在的目录,然后再进行执行;这时,当前工作目录跟项目启动根目录则为同一目录

3. 当前Python系统的安装目录

  • 内置模块 sys, 指的是 python 解释器系统,而不是操作系统
  • 获得当前运行的 python 解释器的全称文件名:sys.executable
  • 获得当前运行的 python 系统的安装目录:os.path.dirname(sys.executable)
  • 获得进行文件,模块查找次序的路径列表:**sys.path,**默认包括启动根目录, python 解释器安装时设定的默认库目录, 环境变量 PYTHONPATH 中定义的路径。

4. 文件和模块的查找顺序

  • 若引用的是纯文件名 ,运行时查找顺序是: 当前文件所在的相同目录 --> 项目启动根目录 --> Python 安装的默认库目录 --> 环境变量 PYTHONPATH --> 操作系统的 path 变量

  • 若引用的是模块名,将不再查找当前文件所在的相同目录,而是直接按路径顺序查找: 项目启动根目录 --> Python 安装的默认库目录 --> 环境变量 PYTHONPATH --> 操作系统的 path 变量

5. sys.path 在PyCharm 中的特殊处理

在实际编码时,有时会单独运行项目中的某个任意 python 文件,而不一定每次都从项目启动文件开始执行。

单独运行某个项目文件时,当前启动根目录将变为单独运行的Python文件所在的目录,而不是项目设计的启动文件所在的启动根目录,这样就有可能造成引用的包或模块查找不到,加载失败。

这是因为项目中的python文件在引用模块时,都是以项目设计的启动根目录为基础进行的相对引用的,而目前这个项目启动根目录不在 sys.path 查找路径列表中,因此造成模块找不到。

但我们在 PyCharm IDE 环境中进行编码调试时, 单独运行某个子目录下的python文件,即使该文件是按项目固定启动根目录进行的模块引用,也没有出现模块引用失败的问题,可以正常运行,这时什么原因?

... ...

这时由于 PyCharm IDE 自身进行了特殊设置和处理。 在 PyCharm 中,可为每一个单独运行的python文件,设置运行时的配置信息: Run 菜单 --> Edit Configurations ..., 其中包含设置项:

  • Add content roots to PYTHONPATH
  • Add source roots to PYTHONPATH

这2个设置项缺省是被选中的。

因此,在 PyCharm IDE 中运行某个单独 python 文件时,sys.path = 当前启动目录 + 源代码根目录(项目的启动根目录) + 其他系统目录信息; 由于项目的启动根目录已被自动加入到了查找路径列表中,因此,该 python 文件单独运行时,按项目启动根目录进行引用的模块可以正常加载。

相关推荐
Chef_Chen10 分钟前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空30 分钟前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩37 分钟前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
yannan201903131 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁1 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev1 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
好喜欢吃红柚子1 小时前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python1 小时前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯2 小时前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
千天夜2 小时前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流