快速了解Python相对导入

1、绝对导入和相对导入

绝对导入:按照sys.path顺序搜索,先主目录(sys.path中第一项''),然后PYTHONPATH环境变量、标准库路径、pth指定路径等。

相对导入:在模块所在同一个包内搜索,注意该包目录与主目录的区别。

例1:有以下目录

app/
    __init__.py
    mod.py
    string.py

mod.py内容:import string

当在app/目录下执行Python mod.py时为绝对导入,当在app上层目录执行python -m app.mod时为相对导入。

2、在python 2.7及之前版本中默认是先“相对”后“绝对”的顺序搜索模块,也就是说先在模块所在同一个包内搜索然后在sys.path中搜索。

在上例中,在app上层目录执行python -m app.mod时,将导入app/string.py(可以在string.py中print或者在mod.py中加入print string.__file__来测试)。

使用以下语句将会只搜索绝对路径:

from __future__ import absolute_import

在mod.py开头加上该语句,在app上层目录执行python -m app.mod时,将导入标准库中的string模块。

在python3.3中默认只搜索绝对路径,要使用相对导入,执行以下语句:

from . import string

注意:开头点号只能用在from语句中,不能用在import语句中。

3、相对导入使用模块的__name__属性来决定模块在包结构中的位置。当__name__属性不包含包信息(i.e. 没有用'.'表示的层次结构,比如'__main__'),则相对导入将模块解析为顶层模块,而不管模块在文件系统中的实际位置。

例2:

app/
    __init__.py
    sub1/
         __init__.py
         mod1.py
     sub2/
         __init__.py
         mod2.py

尝试在mod1.py导入mod2.py,加入from ..sub2 import mod2。

直接在sub1目录下执行python mod1.py或在app目录下执行python sub1/mod1.py将报错:"Attempted relative import in non-package"。

在app目录下执行python -m sub1.mod1也将报错:"Attempted relative import beyond toplevel package"。

正确的做法是:在app上层目录执行python -m app.sub1.mod1,或者不要使用from ..sub2 import mod2而改用其他方式(比如将sub2添加到sys.path)。

例3:

__init__.py
start.py
parent.py
sub/
    __init__.py
    relative.py

start.py中包含import sub.relative,relative.py中包含from .. import parent。

执行python start.py将报错:"Attempted relative import beyond toplevel package"。

解决办法:新建pkg目录,将parent.py、sub目录移到pkg目录中,start.py改为import pkg.sub.relative,其它不变。

总结

以上就是本文关于快速了解Python相对导入的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

您可能感兴趣的文章:

  • 详解Python中的相对导入和绝对导入
时间: 2018-01-11

详解Python中的相对导入和绝对导入

前言 Python 相对导入与绝对导入,这两个概念是相对于包内导入而言的.包内导入即是包内的模块导入包内部的模块. Python import 的搜索路径 在当前目录下搜索该模块 在环境变量 PYTHONPATH 中指定的路径列表中依次搜索 在 Python 安装路径的 lib 库中搜索 Python import 的步骤 python 所有加载的模块信息都存放在 sys.modules 结构中,当 import 一个模块时,会按如下步骤来进行 如果是 import A,检查 sys.modul

详解python中executemany和序列的使用方法

详解python中executemany和序列的使用方法 一 代码 import sqlite3 persons=[ ("Jim","Green"), ("Hu","jie") ] conn=sqlite3.connect(":memory:") conn.execute("CREATE TABLE person(firstname,lastname)") conn.executeman

详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别

详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别 os._exit() 和 sys.exit() os._exit() vs sys.exit() 概述 Python的程序有两中退出方式:os._exit(), sys.exit().本文介绍这两种方式的区别和选择. os._exit()会直接将python程序终止,之后的所有代码都不会继续执行. sys.exit()会引发一个异常:SystemExit,如果这个异常没有被捕获,那

详解 Python中LEGB和闭包及装饰器

详解 Python中LEGB和闭包及装饰器 LEGB L>E>G?B L:local函数内部作用域 E:enclosing函数内部与内嵌函数之间 G:global全局作用域 B:build-in内置作用域 python 闭包 1.Closure:内部函数中对enclosing作用域变量的引用 2.函数实质与属性 函数是一个对象 函数执行完成后内部变量回收 函数属性 函数返回值 passline = 60 def func(val): if val >= passline: print (

详解python中的文件与目录操作

详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os.getcwd()) Current directory is D:\Python36 2.代码2 如果将上面的脚本写入到文件再运行 Current directory is E:\python\work 二 获得目录的内容 Python代码 >>> os.listdir (os.getcwd

详解Python中的from..import绝对导入语句

相对或者绝对import 更多的复杂部分已经从python2.5以来实现:导入一个模块可以指定使用绝对或者包相对的导入.这个计划将移动到使绝对的导入成为默认的细节在其他版本的python中. 我们假设你有一个包目录,像下面这样: pkg/ pkg/__init__.py pkg/main.py pkg/string.py 上面定义了一个包称为 pkg 包含 pkg.main 和pkg.string 两个子模块.考虑在'main.py'中的代码,什么事情会发生如果我们执行语句 import str

详解Python中的多线程编程

一.简介 多线程编程技术可以实现代码并行性,优化处理能力,同时功能的更小划分可以使代码的可重用性更好.Python中threading和Queue模块可以用来实现多线程编程. 二.详解 1.线程和进程        进程(有时被称为重量级进程)是程序的一次执行.每个进程都有自己的地址空间.内存.数据栈以及其它记录其运行轨迹的辅助数据.操作系统管理在其上运行的所有进程,并为这些进程公平地分配时间.进程也可以通过fork和spawn操作来完成其它的任务,不过各个进程有自己的内存空间.数据栈等,所以只

详解Python中的循环语句的用法

一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句. 二.详解 1.if语句 Python中的if子句由三部分组成:关键字本身.用于判断结果真假的条件表达式以及当表达式为真或者非零时执行的代码块.if 语句的语法如下: if expression: expr_true_suite if 语句的expr_true_suite代码块只有在条件表达式的结

详解Python中的文件操作

1.能调用方法的一定是对象,比如数值.字符串.列表.元组.字典,甚至文件也是对象,Python中一切皆为对象. str1 = 'hello' str2 = 'world' str3 = ' '.join([str1,str2]) print(str3) 2.三种基本的文件操作模式:r(only-read).w(only-write).a(append) 对文件进行操作的流程: 第一,建立文件对象. 第二,调用文件方法进行操作. 第三,不要忘了关闭文件.(文件不关闭的情况下,内容会放在缓存,虽然P

详解python中字典的循环遍历的两种方式

开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python3中,下面两种方法都是通用的. 1. 只对键的遍历 一个简单的for语句就能循环字典的所有键,就像处理序列一样: d = {'name1' : 'pythontab', 'name2' : '.', 'name3' : 'com'} for key in d: print (key, ' value