下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922
论坛 >编程语言 >Python 中 import 的机制与实现

Python 中 import 的机制与实现

Abby发布于 2018-04-11 10:33查看:879

概述

Python 是一门优美简单、功能强大的动态语言。在刚刚接触这门语言时,我们会被其优美的格式、简洁的语法和无穷无尽的类库所震撼。在真正的将python应用到实际的项目中,你会遇到一些无法避免的问题。最让人困惑不解的问题有二类,一个 编码问题,另一个则是引用问题。

本文主要讨论关于Python中import的机制与实现、以及介绍一些有意思的Python Hooks。

Python 类库引入机制

首先,看一个简单的例子:

image.png

现在,考虑一下:

  1. 当我们执行main.py的时候,会发生什么事情?

  2. 在main.py文件执行到 import string 的时候,解释器导入的string类库是当前文件夹下的string.py还是系统标准库的string.py呢?

  3. 如果明确的指明⾃己要引⼊的类库?

为了搞清楚上面的问题,我们需要了解关于Python类库引入的机制。

Python的两种引入机制

Python 提供了二种引入机制:

  1. relative import

  2. absolute import

relative import

relative import 也叫作相对引入,在Python2.5及之前是默认的引入方法。它的使用方法如下:

image.png

这种引入方式使用一个点号来标识引入类库的精确位置。与linux的相对路径表示相似,一个点表示当前目录,每多一个点号则代表向上一层目录。

image.png

相对引入,那么我们需要知道相对什么来引入。相对引入使用被引入文件的 __name__ 属性来决定该文件在整个包结构的位置。那么如果文件的__name__没有包含任何包的信息,例如 __name__ 被设置为了__main__,则认为其为‘top level script’,而不管该文件的位置,这个时候相对引入就没有引入的参考物。如上面的程序所示,当我们执行 python main.py 时,Python解释器会抛出 ValueError: Attempted relative import in non-package的异常。

为了解决这个问题,提出了一个解决方案。允许用户使用python -m ex2.main的方式,来执行该文件。在这个方案下,引入了一个新的属性__package__

image.png

absolute import

absolute import 也叫作完全引入,非常类似于Java的引入进制,在Python2.5被完全实现,但是是需要通过 from __future__ import absolute_import 来打开该引入进制。在Python2.6之后以及Python3,完全引用成为Python的默认的引入机制。它的使用方法如下:

image.png

要注意的是,需要从包目录最顶层目录依次写下,而不能从中间开始。

在使用该引入方式时,我们碰到比较多的问题就是因为位置原因,Python找不到相应的库文件,抛出ImportError的异常。让我们看一个完全引用的例子:

image.png

我们尝试着去运行main.py文件,Python解释器会抛出ImportError。那么我们如何解决这个问题呢?

image.png

首先,我们也可以使用前文所述的module的方式去运行程序,通过-m参数来告诉解释器 __package__ 属性。如下:image.png

另外,我们还有一个办法可以解决该问题,在描述之前,我们介绍一个关于Python的非常有用的小知识:Python解释器会自动将当前工作目录添加到PYTHONPATH。如下所示,可以看到我们打印出的 sys.path 已经包含了当前工作目录。

image.png

了解了Python解释器的这个特性后,我们就可以解决完全引用的找不到类库的问题:执行的时候,让解释器自动的将类库的目录添加到PYTHONPATH中。

我们可以在顶层目录中添加一个run_ex3.py的文件,文件内容和运行结果如下,可以看到Python解释器正确的执行了ex3.main文件。

image.png


收藏(0)0
查看评分情况

全部评分

此主贴暂时没有点赞评分

总计:0

回复分享

版主推荐

    共有0条评论

      • IT宅男
      • mr jack
      • Mr ken
      • Mright
      • cappuccino
      • YUI
      • 课课家运营团队
      • 课课家技术团队1
      • 酸酸~甜甜
      • 选择版块:

      • 标题:

      • 内容

      • 验证码:

      • 标题:

      • 内容

      • 选择版块:

      移动帖子x

      移动到: