Python sys.path详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python sys.path详解相关的知识,希望对你有一定的参考价值。
参考技术A 这是两种加载py文件的方式:
1叫做直接运行
2把模块当作脚本来启动(注意:但是__name__的值为\'main\' )
直接启动是把xx.py文件,所在的目录放到了sys.path属性中。
模块启动是把你输入命令的目录(也就是当前路径),放到了sys.path属性中
下面可以看看例子:
假设我们项目的结构是这样的:
这样执行的话,打印sys.path可以看到sys.path的第一个目录就是运行的stat.py所在的目录,也就是activity目录
那如果我们用模块运行 python -m
这样运行的话sys.path的第一个值就是\'\', 也就是当前执行python的目录
如果我们想在stat.py 里面import activity目录上一个文件夹的其他模块是不可以的, 比如我想导入base.connection里面的db_mongo, 这是不可以的,为什么?因为sys.path 就是在activity目录,根目录statictis 没有在sys.path里面啊
这样会报错:
那自然我们就会想能否这样通过相对路径引入
然后执行 python activity/stat.py
这样还回报错,但是是另外一个报错:
这是因为, 如果我们直接执行py文件的话,是不可以使用相对引入的,否则就会报错 Attempted relative import in non-package
那如果我们用模块运行会怎样 python -m
报了另外一个错误
这是因为 ..base的时候已经出了顶级目录了,为什么?因为python -m 的时候,sys.path的第一个目录就是当前执行python的目录, 也就是 ~/vhost/statistics, 这个已经是顶级目录了, 还要..base的话就会超出,所以报错
这个时候,到底是使用直接启动,还是以模块的启动?目的就是把import的那个模块的路径放到sys.path中。
导入一个叫 mod1 的模块时,解释器先在当前目录中搜索名为 mod1.py 的文件。如果没有找到的话,接着会到 sys.path 变量中给出的目录列表中查找。 sys.path 变量的初始值来自如下:
默认情况下PYTHONPATH是空的, 然后进去看到sys.path是一个列表,包括有所有查找包的目录
下面我们给PYTHON加个目录
可以看到\'/home/lidongwei/Desktop\' 这个目录已经被加到sys.path了, 说明PYTHONPATH会加到sys.path
Python模块详解以及import本质,获得文件当前路径os.path.abspath,获得文件的父目录os.path.dirname,放到系统变量的第一位sys.path.insert(0,x)
模块介绍
1、定义:
模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test)
包:用来从逻辑上组织模块的,本质就是一个目录(必须带有一个__init__.py文件)
2、导入方法:
import module_name
引用脚本里的函数用方法module_name.logger()
import module1_name,module2_name
导入多个脚本模块
from module_alex import *
这里相当于导入module_alex脚本文件里的所有代码
from module_alex import m1,m2,m3
from module_alex import logger as logger_alex
这里相当于导入module_alex脚本里的logger函数,并给它起别名为logger_alex,注意这里的 logger不能写成 logger()
用from的方法,这个想再引用module_alex里的函数或者变量,直接logger()就OK了。如果有别名那么直接执行logger_alex()
3、import本质(把模块的所有代码解释了一遍,赋值给module_alex)
from module_alex import name的本质(把name这个代码复制一份到当前脚本)
import本质(路径搜索和搜索路径)
导入模块的本质就是把python文件解释一遍,然后赋值给模块名,(import test 相当于 test=‘test.py all code‘)
导入模块的过程:找文件,找文件所在的路径,找sys.path
所以 我们需要把当前脚本的绝对路径的父父路径,加到sys.path里去,这样就可以找到其他模块。
所以我们引入一个新模块os,os.path.abspath(__file__)可以获得当前模块的绝对路径
然后再通过os.path.dirname可以获取到除文件名以外的路径,我们使用2次,就可以得到父父级目录,现在我们获得了父父级目录,我们把目录加到 sys.path去,但是我们注意我们需要把这个目录放到列表sys.path的第一个位置去~!
导入包的本质就是执行该包下面的__init__.py文件
4、导入优化
以上是关于Python sys.path详解的主要内容,如果未能解决你的问题,请参考以下文章
Python模块详解以及import本质,获得文件当前路径os.path.abspath,获得文件的父目录os.path.dirname,放到系统变量的第一位sys.path.insert(0,x)