import笔记

目录

绝对导入和相对导入

import基本原则

一个例子


绝对导入和相对导入

1. 相对导入

从当前.py文件所在目录下导入模块或包,导入模块 import module,导入包 import pkg,导入包中模块 from pkg import module 或 import pkg.module (注意在 top-level package 中不能使用"."来表示当前目录,即不能用from . import ××× ,原因下文会阐述)

在子包中导入则需要用 "."来表明模块当前所在目录,直接 import 报错。

在子包中直接import pkg/module 只能导入和运行文件在同一目录下的模块或包,否则报错。

如果是在子包中导入,导入当前目录下的模块就在前面使用 ".",如果是当前目录下子包中的模块就用包名前加 "."来导入子包下的模块。

2. 绝对导入

与相对路径和绝对路径的概念一样。在python标准库sys中有一个sys.path的变量,里面记录了绝对导入的搜索路径,当使用from A import B 的时侯就是从sys.path中搜索A.B。另外,sys.path中会包含当前主运行文件的路径作为sys.path列表中的第一个元素。
 

import基本原则

首先明确一点,python只有能识别出包的位置才能成功导入(不论是绝对导入还是相对导入)。而使用相对路径导入时,python根据 __name__ 的值确定包的位置。(使用绝对导入时python直接在 sys.path 中找)

import时,python认为当前目录下的子包、模块都是可见的(但是本级目录的名字也不知道)所以对于当前目录下的包和模块可以直接使用 import pkg 或 import module 导入。(原因是当前运行文件所在目录被添加到了  sys.path 的第一个元素

举个栗子:(说明相对导入时python根据 __name__ 的值确定包的层次结构)

from . import ×××

使用 from . import ××× 这种写法时,该文件不能作为__main__主程序运行。

因为作为主程序运行时 __name__ == "__main__", python 无法识别出当前.py文件所在pkg的名字是什么,而作为被导入的程序时(即非主程序),__name__ == "pkg.×××"(×××为.py文件名),于是python可以识别出当前文件所在包。

另外,只有在子包中才能够使用 ".",因为子包的包名可见,而在 top-level package 中包名对于python来说是未知的。

一个例子

目录结构:

35d10e3d81434b26bd79a5683ad9d7ef.png

 代码:

### import_test/main.py ###

import pkg.b    # 可改成 from pkg import b, 对应下方代码所有pkg.b.××× 改为b.×××
import c

pkg.b.bb()
c.cc()
### import_test/c.py ###

"""
from .pkg import a
a.hello()
上述代码报错:attempted relative import with no known parent package
当前包是未知的!
"""

print(__name__)


def cc():
    print("cccccccc")
### import_test/pkg/a.py ###

def hello():
    print("aaaaaaaa")


print(__name__)
### import_test/pkg/b.py ###

from . import a    # 改成 import a 执行 main.py 时报错! 可改成 from pkg import a
import c        # 不报错 因为在执行 main.py 时,该文件所在目录被添加到了 sys.path 的第一个元素,c.py 就在这个目录中,相当于绝对导入


print(__name__)


def bb():
    a.hello()
    c.cc()

注意:以上.py文件只有main.py可以执行!使用 from . import ××× 的代码通通不能执行!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值