Python sys.path详解

Python sys.path详解,第1张

这是两种加载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 的模块搜索路径 PYTHONPATH 类似 Java 的 CLASSPATH

由以下路径组合而成,通过更改以下 4 者其中之一都可以改变 Python 模块的默认搜索路径:

1. 当前工作目录

2. *** 作系统的 PYTHONPATH 环境变量

3. Python 安装目录 lib/site-packages 中或 PYTHONPATH 中的 .pth 文件定义的路径

如:find ~/my_lib -type d -print >~/python2.6/site-packages/my_lib.pth

4. 运行时对 sys.path 的改变,如:

向后增加:

sys.path.append(path)

path 不要以 / 或 \ 结尾。

向前增加:

sys.path.insert(0, path)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11119966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存