设为首页 加入收藏

TOP

python模块导入细节(一)
2018-11-14 00:08:05 】 浏览:314
Tags:python 模块 导入 细节

python模块导入细节

官方手册:https://docs.python.org/3/tutorial/modules.html

可执行文件和模块

python源代码文件按照功能可以分为两种类型:

  1. 用于执行的可执行程序文件
  2. 不用与执行,仅用于被其它python源码文件导入的模块文件

例如文件a.py和b.py在同一目录下,它们的内容分别是:

# b.py
x="var x in module b"
y=5

# a.py:
import b
import sys
print(b.x)
print(b.y)

a.py导入其它文件(b.py)后,就可以使用b.py文件中的属性(如变量、函数等)。这里,a.py就是可执行文件,b.py就是模块文件,但模块名为b,而非b.py。

python提供了一些标准库,是预定义好的模块文件,例如上面的sys模块。

在此有几个注意点,在后面会详细解释:

  1. 模块b的文件名为b.py,但import导入的时候,使用的名称为b,而非b.py
  2. a.py和b.py是在同一个目录下的,如果不在同目录下能否导入?
  3. 在a.py中访问b.py模块中的属性时,使用的是b.xb.y
  4. 上面都是直接以模块名导入的,python还支持更复杂的包导入方式,例如导入abc/b.py时,使用import abc.b。下一篇文章会详细解释包的导入方式

python模块搜索路径

在a.py中导入模块b的时候,python会做一系列的模块文件路径搜索操作:b.py在哪里?只有找到它才能读取、运行(装载)该模块。

在任何一个python程序启动时,都会将模块的搜索路径收集到sys模块的path属性中(sys.path)。当python需要搜索模块文件在何处时,首先搜索内置模块,如果不是内置模块,则搜索sys.path中的路径列表,搜索时会从该属性列出的路径中按照从前向后的顺序进行搜索,并且只要找到就立即停止搜索该模块文件(也就是说不会后搜索的同名模块覆盖先搜索的同名模块)。

例如,在a.py文件中输出一下这个属性的内容:

# a.py:
import sys
print(sys.path)

结果:

['G:\\pycode', 'C:\\Program Files (x86)\\Python36-32\\python36.zip', 'C:\\Program Files (x86)\\Python36-32\\DLLs', 'C:\\Program Files (x86)\\Python36-32\\lib', 'C:\\Program Files (x86)\\Python36-32', 'C:\\Users\\malong\\AppData\\Roaming\\Python\\Python36\\site-packages', 'C:\\Program Files (x86)\\Python36-32\\lib\\site-packages']

python模块的搜索路径包括几个方面,按照如下顺序搜索:

  • 程序文件(a.py)所在目录,即G:\\pycode
  • 环境变量PYTHONPATH所设置的路径(如果定义了该环境变量,则从左向右的顺序搜索)
  • 标准库路径
  • .pth文件中定义的路径

需要注意,上面sys.path的结果中,除了.zip是一个文件外,其它的搜索路径全都是目录,也就是从这些目录中搜索模块X的文件X.py是否存在。

程序所在目录

这个目录是最先搜索的,且是python自动搜索的,无需对此进行任何设置。从交互式python程序终输出sys.path的结果:

>>> sys.path
['', 'C:\\WINDOWS\\system32', 'C:\\Program Files (x86)\\Python36-32\\Lib\\idlelib', 'C:\\Program Files (x86)\\Python36-32\\python36.zip', 'C:\\Program Files (x86)\\Python36-32\\DLLs', 'C:\\Program Files (x86)\\Python36-32\\lib', 'C:\\Program Files (x86)\\Python36-32', 'C:\\Users\\malong\\AppData\\Roaming\\Python\\Python36\\site-packages', 'C:\\Program Files (x86)\\Python36-32\\lib\\site-packages']

其中第一个''表示的就是程序所在目录。

注意程序所在目录和当前目录是不同的。例如,在/tmp/目录下执行/pycode中的a.py文件

cd /tmp
python /pycode/a.py

其中/tmp为当前目录,而/pycode是程序文件a.py所在的目录。如果a.py中导入b.py,那么将首先搜索/pycode,而不是/tmp。

环境变量PYTHONPATH

这个变量中可以自定义一系列的模块搜索路径列表,这样可以跨目录搜索(另一种方式是设置.pth文件)。但默认情况下这个环境变量是未设置的。

在windows下,设置PYTHONPATH环境变量的方式:命令行中输入:SystemPropertiesAdvanced-->环境变量-->系统环境变量新建

如果是多个路径,则使用英文格式的分号分隔。以下是临时设置当前命令行窗口的PYTHONPATH:

set PYTHONPATH='D:\pypath; d:\pypath1'

在unix下,设置PYTHONPATH环境变量的方式,使用冒号分隔多个路径:

PYTHONPATH=/tmp/pypath1:/tmp/pypath2

如果要永久生效,则写入配置文件中:

echo 'export PYTHONPATH=/tmp/pypath1:/tmp/pypath2' >/etc/profile.d/pypth.sh
chmod +x /etc/profile.d/pypth.sh
source /etc/profile.d/pypth.sh

标准库路径

在Linux下,标准库的路径一般是在/usr/lib/pythonXXX/下(XXX表示python版本号),此目录下有些分了子目录。

例如:

['', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']

其中/usr/lib/python3.5和其内的几个子目录都是标准库的搜索路径。

注意其中/usr/lib/python35.zip,它是ZIP文件组件,当定义此文件为搜索路径时,将自动解压缩该文件,并从此文件中搜索模块。

Windows下根据python安装位置的不同,标准库的路径不同。如果以默认路径方式安装的python,则标准

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇完整的正则表达式知识汇总(Pytho.. 下一篇继承

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目