`
tomhibolu
  • 浏览: 1431368 次
文章分类
社区版块
存档分类
最新评论

[Python源码学习]之模块路径

 
阅读更多

接前面Python源码笔记之Py_InitializeEx,尝试看看Python中用到的一些Path (这部分东西太乱了...具体见PC/getpathp.c 和 Modules/getpath.c 中的注释)。

一个Python程序要有运行,必须要能找到 .py/.pyc/.pyo/.pyd/.so 等,如何找到这些模块,还真是个问题:

sys.executable

可执行程序完整路径(其他函数可据此查找python运行时需要的库)

sys.prefix

平台无关文件

Python安装路径,用来生成标准库搜索路径

sys.exec_prefix

平台相关文件

sys.path

模块搜索路径

prefix 和 exec_prefix,平时用,几乎总是一样的,应该不用细分。

常见默认值

Unix (pure)

prefix/lib/pythonX.Y

/usr/local/lib/pythonX.Y

Unix (non-pure)

exec-prefix/lib/pythonX.Y/

/usr/local/lib/pythonX.Y

Windows

prefix\Lib

C:\PythonXY\Lib\

何处初始化?

这4个均在Py_InitializeEx进行初始化:

初始值

executable

Py_GetProgramFullPath()

prefix

Py_GetPrefix()

exec_prefix

Py_GetExecPrefix()

path

Py_GetPath()

  • _PySys_Init()

PyObject *
_PySys_Init(void)
{
    SET_SYS_FROM_STRING("executable",
                        PyUnicode_FromWideChar(
                               Py_GetProgramFullPath(), -1));
    SET_SYS_FROM_STRING("prefix",
                        PyUnicode_FromWideChar(Py_GetPrefix(), -1));
    SET_SYS_FROM_STRING("exec_prefix",
                        PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));
...
  • PySys_SetPath(Py_GetPath());

void
PySys_SetPath(const wchar_t *path)
{
    PyObject *v;
    if ((v = makepathobject(path, DELIM)) == NULL)
        Py_FatalError("can't create sys.path");
    if (PySys_SetObject("path", v) != 0)
        Py_FatalError("can't assign sys.path");
    Py_DECREF(v);
}

环境变量

与这些path相关的有两个环境变量非常关键:

  • PYTHONHOME

用来指定 prefix 和 exec_prefix 的值,格式:"ThePrefixPath" 或 "ThePrefixPath:TheExec_prefixPath"。注意,指定两个路径时,用冒号分割。

如果使用Py_SetPythonHome()设置了home值,则不会使用环境变量指定的值!

  • PYTHONPATH

设置模块的默认搜索路径,路径间分隔符和平台相关:Windows下分号,其他平台冒号。

3个函数

除了前面的环境变量,下面3个函数也很重要(在Py_InitializeEx之前调用)

  • Py_SetProgramName()

  • Py_SetPythonHome()

  • Py_SetPath()

注意:使用Py_SetPath()以后,prefix和exec_prefix都将为空。Manual中说多个路径采用分号分割!这是错的,应该是和平台相关,Windows下用分号,其他平台冒号。

路径确定

大致分两步:

  • 首先确定 prefix 和 exec_prefix
  • 然后,在prefix和exec_prefix上面追加libpath(比如lib/pythonXX/)以及PYTHONPATH中指定的路径(比如在linux下,可能是L":plat-linux2")

prefix

prefix 的确定(linux下):

  • 如果PYTHONHOME被设置(无论是环境变量,还是Py_SetPythonHome()),则无条件使用它。

  • 否则,按照可执行程序所在路径(Py_SetProgramName)依次往上搜索(准则是:lib/pythonXX/os.py(os.pyc、os.pyo)文件)

  • 否则,使用configure时设置的值

Windows下,prefix和exec_prefix没多大意思了,主要就是确定Pyathon的主目录:

  • 如何PYTHONHOME被设置,则使用
  • 否则,按照可执行程序所在目录向上搜索 (lib/os.py)
  • 否则,查找注册表

path

即 sys.path 的初始值:

  • 如果使用Py_SetPath()设置了路径,则直接使用这些路径

  • 反之:按下面的规则生成
    • 首先添加:环境变量 PYTHONPATH 设置的路径
    • 其次:默认的zip文件路径(和prefix相关),比如:prefix/lib/pythonXX.zip
    • 再次:编译期设置的一些路径(通过PYTHONPATH),和prefix合并成得到的路径,比如:

      • prefix/lib/python3.2
      • prefix/lib/python3.2/plat-linux2
    • 最后:动态加载模块的路径(和exec_prefix相关),比如:exec_prefix/lib/python3.2/lib-dynload

于是,在linux下,可以见到:

'/usr/lib/python3.2'

.py/.pyc/.pyo

'/usr/lib/python3.2/plat-linux2'

平台相关的 .py/.pyc/.pyo

'/usr/lib/python3.2/lib-dynload'

动态库的 .so

参考


分享到:
评论

相关推荐

    python学习课件+python源码90个合集.7z

    python学习课件+python源码90个合集: 002用Python设计第一个游戏(课件+源代码) 004改进我们的小游戏(课件+源代码) 005闲聊之Python的数据类型(课件+源代码) 007了不起的分支和循环(课件) 008了不起的分支和...

    python模块源码

    总的来说,理解Python模块源码对于深入学习Python编程至关重要。通过研究官方模块,我们可以学习到Python的最佳实践,提升编程技巧,并为构建自己的高效代码库打下坚实基础。无论是标准库还是自定义模块,理解其内部...

    易语言调用Python源码例程

    本文将深入探讨如何使用易语言调用Python源码,并通过具体的例程来阐述这一过程。 首先,确保你已经安装了Python环境,包括Python解释器和PythonW(无界面版本)。PythonW用于避免在调用Python脚本时出现控制台窗口...

    Python源码剖析_python_

    深入解析Python源码可以帮助我们理解其内部机制,提升编程技能,优化代码效率。以下是对Python源码剖析的一些关键知识点: 1. **解释器**: Python的执行流程始于解释器,如CPython(官方的Python实现)。它将源代码...

    Python学习资料学习课件python基础源码.zip

    Python学习资料学习课件python基础源码: 001我和Python的第一次亲密接触 002用Python设计第一个游戏 003小插曲之变量和字符串 004改进我们的小游戏 005闲聊之Python的数据类型 006Pyhon之常用操作符 007了不起的...

    python源码课件学习

    "python源码课件学习"的资源包含从Python1到Python19的完整课程内容,这意味着它涵盖了Python的基础到进阶知识,对于初学者或者希望巩固Python技能的人来说是一份宝贵的资料。 1. **Python基础知识**: - 变量与...

    Python源码剖析 深度探索动态语言核心技术.pdf

    ### Python源码学习路径 - **阅读官方文档**:首先熟悉Python的官方文档,了解其基本语法和常用库的使用方法。 - **深入源码**:通过阅读CPython源码来理解Python的内部工作原理。重点关注解释器如何处理语法树、...

    python源码 零基础入门学习Python+课件源码资料.zip

    python源码 零基础入门学习Python+课件源码资料: 002用Python设计第一个游戏(课件+源代码) 004改进我们的小游戏(课件+源代码) 005闲聊之Python的数据类型(课件+源代码) 007了不起的分支和循环(课件) 008...

    Python源码游戏源码-10 植物大战僵尸.rar

    《Python源码游戏源码-10 植物大战僵尸.rar》是一个包含Python编程语言实现的植物大战僵尸游戏的源代码。这个压缩包可能是为了教学或者研究目的而提供的,让我们来深入探讨其中可能涉及的Python编程知识和游戏开发...

    python3.4.10源码

    5. **文档**:虽然在这个压缩包中没有明确的文档,但Python源码通常会包含一些README文件或指导文档,说明如何编译和安装Python。在Python官网,你可以找到完整的文档和开发者指南,帮助你理解和使用源码。 6. **...

    Python项目源码7_简单的Web服务器.rar

    学习这个源码可以帮助你理解Web服务器的工作原理,以及如何用Python实现基本的网络服务。这将对你的Python编程技能和网络应用开发能力有很大的提升。同时,这也是一个很好的起点,可以进一步探索更复杂的Web框架,如...

    Python源码剖析.rar

    学习模块的导入机制和查找路径,有助于我们更好地组织和重用代码。 通过深入学习和分析"Python源码剖析.rar"中的内容,开发者不仅可以提升Python编程的技艺,还能对软件工程的原理有更深的理解,从而在实践中应用更...

    Python源码

    在学习Python源码时,我们需要注意以下几点: 1. 理解变量、数据类型和操作符:这是编程的基础,了解它们如何工作可以帮助我们更好地编写和修改代码。 2. 学习控制流程:学会如何使用条件语句和循环控制程序的执行...

    学生管理系统Python源码.rar

    本篇文章将详细解析一个名为“学生管理系统”的Python源码,帮助读者理解如何利用Python进行实际项目开发,尤其对于初学者和正在进行毕业设计的同学,这将是一个极好的学习案例。 一、系统概述 “学生管理系统”是...

    Python-Python机器学习书籍源码仓库

    Python是当今最流行的编程语言之一,特别是在数据科学和机器学习领域。这个压缩包文件"rasbt-python-machine-learning-book-29fe8f0"显然包含了知名机器学习专家Sebastian Raschka的Python机器学习书籍的源码。这...

    小甲鱼教程Python 源码软件包+课件

    2. "python源码":这个文件夹或文件可能包含了与课程相对应的Python源代码,学习者可以通过阅读和运行这些代码来加深对Python语法和编程概念的理解。 这个资源包的价值在于它提供了一个系统性的学习路径,从最基础...

    Python项目源码56_Python从多路径多Excel表中获取数据并存入新表.rar

    这个Python项目源码的核心是利用Python处理多个Excel文件,并从中提取数据整合到一个新的表格中。在实际工作中,这种操作常见于数据分析、数据整理等场景。下面将详细解释涉及的知识点: 1. **Python数据处理库**:...

    csv文件生成python源码

    首先,我们需要了解Python中的`csv`模块,它是Python标准库的一部分,提供了读取和写入CSV文件的功能。要生成CSV文件,我们主要会用到`csv.writer`对象。以下是一个基本的CSV文件生成过程: 1. 导入`csv`模块: ```...

    基于Python和tensorflow图像注意力机制实现各种图像注意力模块(源码).rar

    资源内容:基于tensorflow2-图像注意力机制实现各种图像注意力模块的Python仿真(完整源码+数据).rar 代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 适用对象:工科生、数学专业、算法等...

    python学习资料几套教程打包下载,比较好的资料和源码

    这份"python学习资料几套教程打包下载,比较好的资料和源码"包含了一系列资源,旨在帮助初学者和进阶者提升Python技能。 首先,我们要明白Python的基础知识。Python的语法结构清晰,强调代码可读性,它支持多种编程...

Global site tag (gtag.js) - Google Analytics