记得刚开始学JAVA的时候,对“代码运行的时候到底从哪里去找依赖的jar包”这个问题,搞了好久才搞清楚,所以在学习Python的一开始,我首先要搞清楚的就是这个问题:
1. Python是如何管理依赖的
2. 我的代码在运行的时候,在机器上寻找依赖的位置和顺序是什么
找到一篇不错的文章:不侵权直接贴连接 http://www.cnblogs.com/russellluo/p/3328683.html
一、Python是如何管理依赖的
Python是通过包和模块管理依赖的
包是一个目录
模块是一个文件
这里跟JAVA区别还是很大的,因为JAVA里面所有的东西都是类
二、我的代码在运行的时候,在机器上寻找依赖的位置和顺序是什么
1)搜索
搜索 是整个导入过程的核心,也是最为复杂的一步。对于被导入模块M,按照先后顺序,搜索的处理步骤为:
在缓存 sys.modules 中查找模块M,若找到则直接返回模块M
否则,顺序搜索 sys.meta_path,逐个借助其中的 finder 来查找模块M,若找到则加载后返回模块M
否则,如果模块M在一个包P中(如import P.M),则以P.__path__为搜索路径进行查找;如果模块M不在一个包中(如import M),则以 sys.path 为搜索路径进行查找
。。。。。。
4、sys.path正如 『导入过程』 中所述,sys.path是 不在包中的模块(如import M)的“搜索路径”。在这种情况下,控制sys.path就能控制模块的导入过程。sys.path 是一个路径名的列表,按照先后顺序,其中的路径主要分为以下四块:程序主目录(默认定义):如果是以脚本方式启动的程序,则为 启动脚本所在目录;如果在交互式命令行中,则为 当前目录。PYTHONPATH目录(可选扩展):以 os.pathsep 分隔的多个目录名,即环境变量os.environ['PYTHONPATH'](类似shell环境变量PATH)标准库目录(默认定义):Python标准库所在目录(与安装目录有关).pth文件目录(可选扩展):以“.pth”为后缀的文件,其中列有一些目录名(每行一个目录名),用法参考 site为了控制sys.path,可以有三种选择:直接修改sys.path列表使用PYTHONPATH扩展使用.pth文件扩展
这一段描述很清楚,跟JAVA的顺序也不一样,JAVA是从近到远的顺序找~~
今天先记录到这里吧
网友评论