接前面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+课件源码资料: 002用Python设计第一个游戏(课件+源代码) 004改进我们的小游戏(课件+源代码) 005闲聊之Python的数据类型(课件+源代码) 007了不起的分支和循环(课件) 008...
Python学习资料学习课件python基础源码: 001我和Python的第一次亲密接触 002用Python设计第一个游戏 003小插曲之变量和字符串 004改进我们的小游戏 005闲聊之Python的数据类型 006Pyhon之常用操作符 007了不起的...
资源内容:基于tensorflow2-图像注意力机制实现各种图像注意力模块的Python仿真(完整源码+数据).rar 代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 适用对象:工科生、数学专业、算法等...
基于OpenCV深度学习神经网络人脸模块(OpenCV DNN Face)的实时人脸识别python源码+项目说明.zip 在OpenCV DNN Face模块推出之前,OpenCV实现人脸检测多数都是使用haar人脸特征检测,利用cv2.CascadeClassifier加载...
基于深度学习实现的声纹识别项目python源码+项目说明文档 本教程笔者使用的是[中文语音语料数据集],这个数据集一共有3242个人的语音数据,有1130000+条语音数据。如果读者有其他更好的数据集,可以混合在一起使用,...
基于易函数的理念设计和开发的qt窗口设计器python源码+说明文档.zip 专注于 PyQt 桌面应用软件开发 为中国人快速入门 python 编程 支持跨平台,`Window` `MacOS` `Ubuntu` ,实现一套代码多端运行。 配备完整的...
3.项目包括6个模块:数据预处理、客流预测、百度地图API调用、GUI界面设计、路径规划和智能推荐。选用GBDT建立模型,GBDT通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮的残差基础上进行训练;采用...
毕业设计-基于区块链的招投标企业征信数据马赛克名片的设计python源码+介绍PPT+开题报告.zip ### 配置Anaconda Django环境 `conda create --name mosaic python=3.9` 创建虚拟环境 `source activate mosaic` 激活...
博文《python做了一个极简的栅格地图行走机器人,到底能干啥?[第四弹]——解锁路径自动规划功能》我们用python手搓了一个极其简单的行走机器人,建立了机器人速度控制模型,具有: ...自动路径规划模块 路径自动控制
课程设计-遗传算法解决旅行商问题python源码+项目说明+实验报告 【项目介绍】 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、通信...
本项目基于朴素贝叶斯和SVM...从github 网站下载与python PIL 库配搭使用的文字引擎pytesseract,将PIL 文件夹里的.py 文件,改为相应pytesseract.exe 路径。注册百度云账号,分别建立图像文字识别和图像识别的小程序。
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
使用Python Web框架Django开发的一个B2C网上蔬果商城,包含用户、商品、购物车、订单等模块等等,使用了Celery异步任务队列,MySQL数据库,Redis数据库,FastDFS分布式的图片存储服 务,Nginx负载均衡服务器,uWSGI...
基于生物启发式算法的多智能体强化学习算法python实现源码+项目说明+模型及注释.zip ## 项目介绍: 多智能体系统(MAS)由于具有解决复杂任务的灵活性、可靠性和智能性,已被广泛地应用于不同的应用领域,如计算机网络...
1、资源内容:基于yolov7改进添加对mlu200支持...擅长计算机视觉、目标检测模型、智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、智能控制、路径规划、无人机等多种领域的算法仿真实验,欢迎交流学习。
扫描器采用python2.7版本,django框架,mysql数据库,B/S架构,直接运行python runserver manager.py即可,然后通过浏览器访问。 扫描器采用模块化编程思想,将各个功能分装为各个模块。 包含模块: (1)主爬虫模块...
基于Python实现的医疗机构药品及耗材信息管理系统源码+项目说明+sql数据库.zip 后台路径地址:localhost:8080/djangoqkby2/admin/dist/index.html 管理员 abo 密码 abo 数据库连接路径:config user = root ...
其中数据集来源于Kaggle,包含了用户的ID、游戏名称、是否购买或游玩、游戏时长,共包含12393名用户,涉及游戏数量5155款,将数据集置于Jupyter工作路径下的steam-video-games文件夹中;使用矩阵分解算法,将用户-...
基于python selenium实现B站直播弹幕和礼物信息爬虫源码+项目操作说明.zip 实现原理: 1.核心:数据去重 直播间网页页面可容纳的弹幕和礼物数据是有限的,且这些数据不断地在更新增加,超过一定量后,将会发生滚动...