接前面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()
|
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));
...
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相关的有两个环境变量非常关键:
用来指定 prefix 和 exec_prefix 的值,格式:"ThePrefixPath" 或 "ThePrefixPath:TheExec_prefixPath"。注意,指定两个路径时,用冒号分割。
如果使用Py_SetPythonHome()设置了home值,则不会使用环境变量指定的值!
设置模块的默认搜索路径,路径间分隔符和平台相关:Windows下分号,其他平台冒号。
3个函数
除了前面的环境变量,下面3个函数也很重要(在Py_InitializeEx之前调用)
-
Py_SetProgramName()
-
Py_SetPythonHome()
-
Py_SetPath()
注意:使用Py_SetPath()以后,prefix和exec_prefix都将为空。Manual中说多个路径采用分号分割!这是错的,应该是和平台相关,Windows下用分号,其他平台冒号。
路径确定
大致分两步:
prefix
prefix 的确定(linux下):
Windows下,prefix和exec_prefix没多大意思了,主要就是确定Pyathon的主目录:
- 如何PYTHONHOME被设置,则使用
- 否则,按照可执行程序所在目录向上搜索 (lib/os.py)
- 否则,查找注册表
path
即 sys.path 的初始值:
于是,在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个合集: 002用Python设计第一个游戏(课件+源代码) 004改进我们的小游戏(课件+源代码) 005闲聊之Python的数据类型(课件+源代码) 007了不起的分支和循环(课件) 008了不起的分支和...
总的来说,理解Python模块源码对于深入学习Python编程至关重要。通过研究官方模块,我们可以学习到Python的最佳实践,提升编程技巧,并为构建自己的高效代码库打下坚实基础。无论是标准库还是自定义模块,理解其内部...
本文将深入探讨如何使用易语言调用Python源码,并通过具体的例程来阐述这一过程。 首先,确保你已经安装了Python环境,包括Python解释器和PythonW(无界面版本)。PythonW用于避免在调用Python脚本时出现控制台窗口...
深入解析Python源码可以帮助我们理解其内部机制,提升编程技能,优化代码效率。以下是对Python源码剖析的一些关键知识点: 1. **解释器**: Python的执行流程始于解释器,如CPython(官方的Python实现)。它将源代码...
Python学习资料学习课件python基础源码: 001我和Python的第一次亲密接触 002用Python设计第一个游戏 003小插曲之变量和字符串 004改进我们的小游戏 005闲聊之Python的数据类型 006Pyhon之常用操作符 007了不起的...
"python源码课件学习"的资源包含从Python1到Python19的完整课程内容,这意味着它涵盖了Python的基础到进阶知识,对于初学者或者希望巩固Python技能的人来说是一份宝贵的资料。 1. **Python基础知识**: - 变量与...
### Python源码学习路径 - **阅读官方文档**:首先熟悉Python的官方文档,了解其基本语法和常用库的使用方法。 - **深入源码**:通过阅读CPython源码来理解Python的内部工作原理。重点关注解释器如何处理语法树、...
python源码 零基础入门学习Python+课件源码资料: 002用Python设计第一个游戏(课件+源代码) 004改进我们的小游戏(课件+源代码) 005闲聊之Python的数据类型(课件+源代码) 007了不起的分支和循环(课件) 008...
《Python源码游戏源码-10 植物大战僵尸.rar》是一个包含Python编程语言实现的植物大战僵尸游戏的源代码。这个压缩包可能是为了教学或者研究目的而提供的,让我们来深入探讨其中可能涉及的Python编程知识和游戏开发...
5. **文档**:虽然在这个压缩包中没有明确的文档,但Python源码通常会包含一些README文件或指导文档,说明如何编译和安装Python。在Python官网,你可以找到完整的文档和开发者指南,帮助你理解和使用源码。 6. **...
学习这个源码可以帮助你理解Web服务器的工作原理,以及如何用Python实现基本的网络服务。这将对你的Python编程技能和网络应用开发能力有很大的提升。同时,这也是一个很好的起点,可以进一步探索更复杂的Web框架,如...
学习模块的导入机制和查找路径,有助于我们更好地组织和重用代码。 通过深入学习和分析"Python源码剖析.rar"中的内容,开发者不仅可以提升Python编程的技艺,还能对软件工程的原理有更深的理解,从而在实践中应用更...
在学习Python源码时,我们需要注意以下几点: 1. 理解变量、数据类型和操作符:这是编程的基础,了解它们如何工作可以帮助我们更好地编写和修改代码。 2. 学习控制流程:学会如何使用条件语句和循环控制程序的执行...
本篇文章将详细解析一个名为“学生管理系统”的Python源码,帮助读者理解如何利用Python进行实际项目开发,尤其对于初学者和正在进行毕业设计的同学,这将是一个极好的学习案例。 一、系统概述 “学生管理系统”是...
Python是当今最流行的编程语言之一,特别是在数据科学和机器学习领域。这个压缩包文件"rasbt-python-machine-learning-book-29fe8f0"显然包含了知名机器学习专家Sebastian Raschka的Python机器学习书籍的源码。这...
2. "python源码":这个文件夹或文件可能包含了与课程相对应的Python源代码,学习者可以通过阅读和运行这些代码来加深对Python语法和编程概念的理解。 这个资源包的价值在于它提供了一个系统性的学习路径,从最基础...
这个Python项目源码的核心是利用Python处理多个Excel文件,并从中提取数据整合到一个新的表格中。在实际工作中,这种操作常见于数据分析、数据整理等场景。下面将详细解释涉及的知识点: 1. **Python数据处理库**:...
首先,我们需要了解Python中的`csv`模块,它是Python标准库的一部分,提供了读取和写入CSV文件的功能。要生成CSV文件,我们主要会用到`csv.writer`对象。以下是一个基本的CSV文件生成过程: 1. 导入`csv`模块: ```...
资源内容:基于tensorflow2-图像注意力机制实现各种图像注意力模块的Python仿真(完整源码+数据).rar 代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 适用对象:工科生、数学专业、算法等...
这份"python学习资料几套教程打包下载,比较好的资料和源码"包含了一系列资源,旨在帮助初学者和进阶者提升Python技能。 首先,我们要明白Python的基础知识。Python的语法结构清晰,强调代码可读性,它支持多种编程...