https://moonlight.blog.csdn.net/article/details/80393967

python 解释器

当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。

由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。

常见的Python解释器有: CPython IPython PyPy Jython IronPython


import 模块路径搜索

python中import某个A模块时,
首先会从python的内置模块中查找是否含义该模块的定义,
若未查询到会从sys.path对应的模块路径查询是否含有对应模块的定义,
如果搜索完成依然没有对应A模块时则抛出import的异常

注: sys.path 包含 PYTHONPATH

标准库

lib 目录下(home目录\pythonXX\lib)

第三方库

在lib目录下的site-package目录下(home目录\pythonXX\lib\site-packages)

sys.path[0]

列表的第一项,path[0],在程序启动时初始化,是包含用来调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果解释器被交互式地调用,或者脚本是从标准输入读取的),path[0]是空字符串,它引导Python首先在当前目录中搜索模块。
path的搜索顺序是有序的。

python的两种加载py文件的方式

  • python xxx.py

直接运行, sys.path[0]是当前脚本的运行目录(调用python解释器脚本所在目录)

  • python -m xxx.py

把模块当做脚本来启动, sys.path[0]是空值字符串, 也就是当前执行python的目录

可能看起来说的python运行方式和sys.path有点大相径庭,但实际上两种不同方式的运行导致sys.path[0]的值是有差异的


使用场景

在实际开发中,默认包含了当前目录为搜索路径,所以,当前目录下的模块和子模块均可以正常访问。但是若一个模块需要import平级的不同目录的模块,或者上级目录里面的模块,就可以通过修改path来实现。

修改path的几种方法

方法一:函数添加
这是即时生效的方法,就是在模块里面修改sys.path值,这种方法修改的sys.path作用域只是当前进程,进程结束后就失效了。
个人比较推荐这种方法,比较干净, 避免一些冲突问题。

比如现在的代码目录结构:
/src/configs/config.py
/src/common/Database.py

假如Database.py期望导入config. py,则可以增加上级目录到sys.path列表里面:

  1. parent_path = os.path.dirname(sys.path[0])
  2. if parent_path not in sys.path:
  3. sys.path.append(parent_path)
  4. import configs.config

方法二: 添加.pth文件
在site-packages/ 增加一个路径文件,如mypkpath.pth,必须以.pth为后缀,将模块的路径写进去,一行一个路径,写上要加入的模块文件所在的目录名称。这种方法一劳永逸, 简单暴力。

举个例子,将/tmp/增加到sys.path
首先cd到指定python的sit-packages/目录下,然后创建一个文件,例如test.pth(注意后缀要为.pth),在文件中增加/tmp/路径信息,保存退出。
python2.7/site-packages/test.pth文件中添加一条:

  1. /tmp/

方法三:修改环境变量
静态:
添加系统环境变量PYTHONPATH,在这个环境变量中输入相关的路径,不同的路径之间用逗号(英文的!)分开。路径会自动加入到sys.path中。而且可以在不同的python版本中共享,应该是一样较为方便的方法。
动态:
命令窗口添加路径

  1. export PYTHONPATH=$PYTHONPATH:/home/ershisui

注意:此方法只在当前命令窗口生效,即如果打开一个新的Terminal 窗口,定位到当前目录, 打印PYTHONPATH 是没有刚才加入的路径的。


sys.path 与 init.py

init .py文件将一个文件夹转化为一个package,这对于创建一个模块的层次结构是很有用的,这样就可以使用这样的导入语句:

  1. import mymodule.cool.stuff

如果没有package,这样就不行了。

假如有文件夹mymodule,mymodule下有文件夹cool,cool目录下有stuff.py脚本
将环境变量C:\mymodule加到sys.path中,在mymodule目录下简历 init .py里面写上import cool(文件夹),在cool目录下新建 init .py内容为空
运行时,就只需import mymodule.cool.stuff即可。
注:不需要增加子目录,因为在目录中我们有 init .py