Python**||**sys.path**||**os.path**||**pythonpath及其内容添加等操作

  • sys.path动态的改变Python搜索路径

当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。

import os

Python解析器会搜索当前目录、已安装的内置模块、第三方模块,搜索路径就存放在sys模块的path中。

搜索路径是一个解释器会先进行搜索的所有目录的列表。

所以说sys.path是python的搜索模块的路径集,是一个list。

在这里插入图片描述

如果模块和自己写的脚本不在同一个目录下,在脚本开头用sys.path.append(path)添加所需路径,这种方法是运行时修改搜索路径,退出python环境后自己添加的路径就会消失。

如果要永久添加路径到sys.path:

  1. 将写好的py文件放到 已经添加到系统环境变量的 目录下 ;
  2. 在 /usr/lib/python2.6/site-packages 下面新建一个.pth 文件(以pth作为后缀名)
    将模块的路径写进去,一行一个路径,如: vim pythonmodule.pth
    /home/liu/shell/config
    /home/liu/shell/base
  3. 使用PYTHONPATH环境变量

export PYTHONPATH=$PYTHONPATH:/home/liu/shell/config

PYTHONPATH也是Python搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找。

在这个环境变量中输入相关的路径,如果是windows系统,不同的路径之间用分号(英文的;)分开,如果是linux系统,不同的路径之间用逗号分开(英文的,)。

如果PYTHONPATH 变量还不存在,可以创建它!

  1. 在系统的环境变量中设置的PYTHONPATH,是永久的。
  2. 命令行中设置的PYTHONPATH,在命令行窗口关闭后,就是失效了
  • os.path 主要用于获取文件的属性(菜鸟教程

方法说明
os.path.abspath(path)返回绝对路径
os.path.basename(path)返回文件名
os.path.commonprefix(list)返回list(多个路径)中,所有path共有的最长的路径
os.path.dirname(path)返回文件路径
os.path.exists(path)如果路径 path 存在,返回 True;反之,返回 False。
os.path.lexists路径存在则返回True,路径损坏也返回True
os.path.join(path1[, path2[, …]])把目录和文件名合成一个路径
os.path.expandvars(path)根据环境变量的值替换path中包含的" n a m e " 和 " name"和" name""{name}"
os.path.getatime(path)返回最近访问时间(浮点型秒数)
os.path.getmtime(path)返回最近文件修改时间
os.path.getctime(path)返回文件 path 创建时间
  • 参考

oOo右右】 【liuchunming033】 【修改Python搜索路径

  • 问题

对PYTHONOATH的理解似乎有点问题???

PYTHONPATH和PATH区别??

2018.11.16写于济南
2018.11.20修改于乐陵

<think>我们正在讨论的是动态修改sys.path与设置PYTHONPATH的区别。这两个概念都与Python如何查找模块有关。根据引用[1]和[2],sys.path是一个列表,包含了Python解释器在导入模块时搜索的路径顺序。而PYTHONPATH是一个环境变量,它也可以影响模块搜索路径。引用[4]提到,当使用sys.path.append()添加路径时,该路径会被加到sys.path列表的末尾;而设置PYTHONPATH环境变量后,该路径会被添加sys.path列表的开头(在Python解释器启动时)。这个顺序很重要,因为Python导入模块时,会按照sys.path中的顺序搜索,直到找到第一个匹配的模块。因此,我们可以从以下几个方面来对比:1.**生效时机**:-设置PYTHONPATH:在启动Python解释器之前设置,解释器启动时会读取该环境变量并将其路径添加sys.path的开头(引用[4])。-动态修改sys.path:在Python程序运行过程中,通过sys.path.append()或sys.path.insert()修改,通常放在脚本的开头部分。2.**作用范围**:-PYTHONPATH:是系统环境变量,影响所有在该环境下运行的Python程序。-sys.path修改:只影响当前运行的程序(因为每次启动解释器都会重新初始化sys.path)。3.**路径顺序**:-PYTHONPATH中的路径会被添加sys.path的前面(引用[4]),因此优先级较高。-使用sys.path.append()添加的路径在列表末尾,优先级较低。而sys.path.insert(0,path)可以将其添加到前面,提高优先级。4.**持久性**:-PYTHONPATH:需要设置环境变量(可以在bashrc、profile或系统环境变量中设置),设置后永久有效(直到下次更改)。-sys.path修改:每次运行程序都需要执行修改代码,临时有效,程序退出后修改丢失。5.**使用场景**:-PYTHONPATH:适合需要长期设置的路径,例如项目中的通用库目录。-动态修改sys.path:适合临时添加路径,例如在脚本中临时添加当前脚本的父目录以便导入同级目录的模块。另外,引用[3]还提到了永久添加路径的其他方法,例如使用.pth文件,这属于系统级别的配置,与PYTHONPATH类似,但优先级和配置方式不同。总结:两者最本质的区别在于生效的时机和作用范围。PYTHONPATH在解释器启动前生效,影响所有后续运行的Python程序;动态修改sys.path只在当前运行时有效,并且可以精确控制路径在列表中的位置。下面我们用一个表格来对比:|特性|设置PYTHONPATH|动态修改sys.path(例如append)||--------------------|----------------------------------------|-------------------------------------||**生效时机**|解释器启动前|解释器启动后,程序运行时||**作用范围**|系统环境级别(所有Python程序)|当前运行的程序||**路径添加位置**|添加sys.path列表开头(优先级高)[^4]|append在末尾,insert可指定位置||**持久性**|永久(直到环境变量改变)|临时(程序退出后失效)||**配置方式**|操作系统环境变量设置|在Python代码中使用sys.path方法||**是否影响其他程序**|是|否|注意:如果使用`sys.path.insert(0,path)`,那么该路径会放在最前面,与PYTHONPATH添加的路径一样具有高优先级,但只对当前程序有效。因此,在需要临时调整模块搜索路径时(比如在脚本中),通常使用动态修改sys.path的方式。而如果希望某个路径对所有Python程序都有效,则设置PYTHONPATH。最后,根据用户需求生成相关问题。相关问题:1.如何设置PYTHONPATH环境变量(Windows/Linux/Mac)?2.Python模块搜索路径优先级是怎样的?3.除了sys.pathPYTHONPATH,还有哪些方法可以添加模块搜索路径?4.为什么使用sys.path.append()添加路径后仍然无法导入模块?</think> ### 动态修改 `sys.path` 与设置 `PYTHONPATH` 的本质区别 在 Python 模块导入机制中,动态修改 `sys.path` 和设置 `PYTHONPATH` 环境变量都会影响模块搜索路径,但两者存在根本性差异: #### 1. 作用时机对比 | **特征** | **`sys.path` 动态修改** | **`PYTHONPATH` 设置** | |----------------|-----------------------------------------|--------------------------------------| | **生效时机** | Python 运行时动态生效 | Python 解释器启动前静态生效 | | **作用域** | 仅影响当前 Python 进程 | 影响当前 shell 会话的所有 Python 进程 | | **生命周期** | 进程退出后即失效 | 随环境变量持续存在 | **核心区别**: - `PYTHONPATH` 是解释器启动时初始化 `sys.path` 的基础 - `sys.path` 修改是对已初始化的路径列表的动态操作 数学表示为: $$sys.path_{final} = PYTHONPATH \cup sys.path_{static} \cup sys.path_{dynamic}$$ 其中 $\cup$ 表示路径集合的合并[^1][^2][^4] #### 2. 路径优先级差异 | **操作方式** | **路径在 sys.path 中的位置** | |----------------------|-----------------------------| | `export PYTHONPATH=path` | 插入到列表**开头**(优先级高)[^4] | | `sys.path.append(path)` | 添加到列表**末尾**(优先级低) | | `sys.path.insert(0, path)` | 插入到列表**开头**(同 PYTHONPATH) | **路径搜索顺序**: ```python sys.path = [ *PYTHONPATH路径, # 最高优先级 *内置路径, *安装路径, # 如 site-packages *入口脚本所在目录, *手动添加的路径 # 取决于插入位置 ] ``` 当导入模块时,Python 按此顺序依次搜索直到找到匹配模块[^1][^2] #### 3. 使用场景对比 **适用 `PYTHONPATH` 的情况**: 1. 需要**永久性**配置项目路径 2.**多个脚本**共享相同路径配置时 3. 在 Docker 等容器环境中预置路径 **适用动态修改 `sys.path` 的情况**: 1. **临时性**调试(如 Jupyter notebook) 2. 需要精确控制路径插入**位置** 3. 在运行时动态发现并添加路径(如插件系统) #### 4. 实际效果验证 ```python import sys print("修改前的路径:") print('\n'.join(sys.path)) # 动态修改示例 sys.path.append('/tmp/low_priority') sys.path.insert(0, '/tmp/high_priority') print("\n修改后的路径:") print('\n'.join(sys.path)) ``` 运行结果将显示: 1. PYTHONPATH 路径位于最前 2. insert(0) 添加的路径紧随其后 3. append() 添加的路径在末尾 #### 5. 持久性解决方案 对于**永久性**路径配置,推荐方法包括: 1. 设置 `PYTHONPATH`: ```bash # Linux/macOS export PYTHONPATH="/project/path:$PYTHONPATH" # Windows setx PYTHONPATH "C:\project\path;%PYTHONPATH%" ``` 2. 创建 `.pth` 文件: ```python # 在 site-packages 中添加 my_paths.pth /project/main /project/utils # 子模块路径 ``` 3. 使用 `uv pip install -e .` 进行可编辑安装[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值