Python中导入模块的几种方式总结

目录
  • Part.I 预备知识
    • Chap.I 几个概念的区分
    • Chap.II 模块中的 all 变量
  • Part.II 导入模块的几种方法
    • Chap.I 方法
    • Chap.II 实例
  • 补充:python导入自己的模块
  • 总结

Part.I 预备知识

Chap.I 几个概念的区分

  • Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和 Python 语句。
  • Python 包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__init__.py 用于标识当前文件夹是一个包。
  • 文件夹:文件夹就是不存在 __init__.py 文件的文件夹。

Chap.II 模块中的 all 变量

__all__ 是针对模块公开接口的一种约定,以提供了“白名单”的形式暴露接口。如果定义了__all__,其他文件中使用from xxx import *导入该文件时,只会导入 __all__ 列出的成员,可以其他成员都被排除在外。

定义 all 需要注意的地方

  • __all__ 的形式都是 list类型。如果写成其他类型, pyflakes 等 lint 工具可能无法识别。
  • 不能动态生成 __all__,如使用列表解析式。__all__ 的作用是定义公开接口,需要以字面量的形式显式写出来。
  • 即使定义了 __all__, 也不应该在非临时代码中使用 from xxx import * 语法,或用编程工具模拟 Ruby 的自动 import。Python 不像 Ruby,没有 Module 这类成员,模块就是命名空间隔离的执行者。如果打破了这一层,引入诸多动态因素,生产环境中跑的代码就可能充满不确定性,调试也会变得困难。
  • 按照 PEP8 建议的风格,__all__ 应该写在所有 import 语句下面,函数、常量等成员定义的上面。
  • 如果一个模块需要暴露的接口改动频繁,__all__ 可以这样定义,这样修改一个暴露的接口只修改一行,方便版本控制的时候看 diff。最后多出的逗号在 Python 中是允许的,符合 PEP8 风格。
__all__ = [
"foo",
"bar",
"egg",
]

Part.II 导入模块的几种方法

Chap.I 方法

Python 导入模块一般用到两种方法:

  • import model1
  • from model import xxx

当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线_或者双下划线__)开头的变量、函数和类。因此,如果我们不想模块文件中的某个成员被引入到其它文件中使用,可以在其名称前添加下划线。

除此之外,还可以借助模块提供的 __all__ 变量,该变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称。通过在模块文件中设置 __all__ 变量,当其它文件以from 模块名 import *的形式导入该模块时,该文件中只能使用 __all__ 列表中指定的成员。

也就是说,当使用from 模块名 import *方法导入模块的时候,不会导入下划线_函数;另外,如果模块中有__all__,则导入的函数还要受到__all__的控制;当使用import 模块名导入函数时,则不会受到上面两个的限制。

所以,以后在确定某些函数不想被访问到,就用下划线_或者用__all__,并使用from 模块名 import *方法导入模块;当想要使用模块中的所有函数时,则使用import 模块名来导入模块。

Chap.II 实例

比如现在有个文件叫b.py

# ------------ b.py 内容 ----------------------
__all__ = [
    'b_hello',
    '_b_hello'
]

def b_hello():
    print("B_HELLO")

def _b_hello():
    print("B_private")

def b_world():
    print("B_private_world")

现在使用from 模块名 import *方法导入模块来调用函数:

from b import *
b_hello()
_b_hello()
b_world()
# ------------ return --------(当 b.py 中没有有变量 __all__ 时)
B_HELLO
Error:xxxxx
B_private_world
# ------------ return --------(当 b.py 中有变量 __all__ 时)
B_HELLO
B_private
Error:xxxxx

使用__all__变量,使得原本不能被访问到的_b_hello可以被访问到;因为__all__中没有包含b_world,所以使得原本能被访问到的b_world不能被访问到。

现在使用import 模块名方法导入模块来调用函数:

import b
b.b_hello()
b._b_hello()
b.b_world()
# ------------ return --------
B_HELLO
B_private
B_private_world

所以,以后在确定某些函数不想被访问到,就用下划线_或者用__all__,并使用from 模块名 import *方法导入模块;当想要使用模块中的所有函数时,则使用import 模块名来导入模块。

ps:当包(含有__init__.py文件的文件夹)中含有子模块时,可以使用.来导入。比如import lib.model1 as md,就是调用包lib中的模块model1

补充:python导入自己的模块

在实际的编程生活当中,我们除了会去import已经存在的包外,当然还会偶尔自定义一些模块,然后来导入,,,其实一般而言,自定义的模块也就是一系列的脚本,具体的,自己写好了脚本,然后导入,导入的情况分为以下情况:

1.自定义模块与所需要调用自定义模块的文件在同一文件夹下

这时的调用就较为简单了,直接导入即可

比如说我想要在learnpandas中导入m1.py,只需要在learnpandas脚本开头声明import m1.py即可

2.自定义模块与所需要调用自定义模块的文件不在同一文件夹下

其实这个的话,如果不怕麻烦的话可以用1中的方法,把需要导入的文件一个一个手动拖到当前文件夹中,,,当然这个方法时比较复杂的,尤其是要导入的文件较多的时候,,,,

这个时候有一个更聪明的方法

假设下图是我们需要导入的文件目录

在这种情况下,我们在folder中新建一个__init__.py文件,此时的folder不再是一个普通的文件夹,而是一个包 package

在这个时候,想导入哪一个文件的话就只需在文件开头import folder.filename即可(记得要先将自定义库路径添加到Python的库路径中)

3.找到本地库的路径,然后将文件拷进去即可

4.手动给python添加搜索路径,具体做法是:

在python安装目录的\Lib\site-packages文件夹中建立一个.pth文件,内容为自己写的库绝对路径

- - - - - - - - - - - - - - - - - -分割线- - - - - - - - - - - - - - - - - -

将自定义库的路径添加到Python的库路径中去,有如下两种方法:

1. 动态的添加库路径。在程序运行过程中修改sys.path的值,添加自己的库路径

import sys

sys.path.append(r'your_path')

2. 在Python安装目录下的\Lib\site-packages文件夹中建立一个.pth文件,内容为自己写的库路径。示例如下

E:\\work\\Python\\http

E:\\work\\Python\\logging

- - - - - - - - - - - - - - - 分割线 - - - - - - - - - - - - - - - - - -

在这里说一句Python的包搜索路径:

Python会在以下路径中搜索它想要寻找的模块:

1. 程序所在的文件夹

2. 标准库的安装路径

3. 操作系统环境变量PYTHONPATH所包含的路径

总结

到此这篇关于Python中导入模块的几种方式总结的文章就介绍到这了,更多相关Python导入模块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python模块导入的细节详解

    python模块导入细节 本文主要介绍了关于python模块导入的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: 用于执行的可执行程序文件 不用与执行,仅用于被其它python源码文件导入的模块文件 例如文件a.py和b.py在同一目录下,它们的内容分别是: # b.py x="var x in m

  • python如何导入自己的模块

    目录 如何导入自己的模块 1.自定义模块与所需要调用自定义模块的文件在同一文件夹下 2.自定义模块与所需要调用自定义模块的文件不在同一文件夹下 3.找到本地库的路径 4.手动给python添加搜索路径 导入本地模块报错的问题 以下图为例说明 如何导入自己的模块 在实际的编程生活当中,我们除了会去import已经存在的包外,当然还会偶尔自定义一些模块,然后来导入,其实一般而言,自定义的模块也就是一系列的脚本,具体的,自己写好了脚本,然后导入,导入的情况分为以下情况: 1.自定义模块与所需要调用自定

  • Python3导入自定义模块的三种方法详解

    前话 最近跟着廖雪峰的教程学到 模块 这一节.关于如何自定义一个模块,如果大家不懂的话先来看看基本的介绍: 模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Module). 使用模块有什么好处? 最大的好处是大大提高了代码的可维护性.其次,编写代码不必从零

  • 详解python中的模块及包导入

    python中的导入关键字:import 以及from  import 1.import import一般用于导入包以及模块. 不过有个小问题: (1)当导入的是模块的时候是可以直接可以使用模块内的函数以及变量的, 比如说:包名为:com.test,在这个包底下有个模块为a.py,那么当其他包中的模块想要引入a模块的时候写法为 import com.test.a 在b.py中调用的方式为:com.test.a.(a中的函数或者变量),而不能直接写为a.(a中的函数名或者变量) (2)当导入的是包

  • Python创建模块及模块导入的方法

    本文实例讲述了Python创建模块及模块导入的方法.分享给大家供大家参考.具体分析如下: python学习手册中写道: 定义模块,只要使用文本编辑器,把一些python代码输入到文本中,然后以.py为后缀名进行保存,任何此类文件都会被认为是python模块. 比如说,下面的代码输入到一个文件中,就可以看作是一个模块: def printme(var): print var if __name__ == '__main__': printme(1) 假设说输入到a.py中,那么import a就可

  • Python中几种导入模块的方式总结

    模块内部封装了很多实用的功能,有时在模块外部调用就需要将其导入.常见的方式有如下几种: 1 . import >>> import sys >>> sys.path ['', 'C:\\Python34\\Lib\\idlelib', 'C:\\Windows\\system32\\python34.zip', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34', 'C:\\Python34\\lib\\s

  • Python中导入模块的几种方式总结

    目录 Part.I 预备知识 Chap.I 几个概念的区分 Chap.II 模块中的 all 变量 Part.II 导入模块的几种方法 Chap.I 方法 Chap.II 实例 补充:python导入自己的模块 总结 Part.I 预备知识 Chap.I 几个概念的区分 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和 Python 语句. Python 包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成

  • Python导入模块的3种方式小结

    目录 导入模块方式一:临时添加模块完整路径 导入模块方式二:将模块保存到指定位置 导入模块方式三:设置环境变量 很多初学者经常遇到这样的问题,即自定义 Python 模板后,在其它文件中用 import(或 from...import) 语句引入该文件时,Python 解释器同时如下错误: ModuleNotFoundError: No module named '模块名' 意思是 Python 找不到这个模块名,这是什么原因导致的呢?要想解决这个问题,读者要先搞清楚 Python 解释器查找模

  • Python中实现单例模式的n种方式和原理

    在Python中如何实现单例模式?这可以说是一个经典的Python面试题了.这回我们讲讲实现Python中实现单例模式的n种方式,和它的原理. 什么是单例模式 维基百科 中说: 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获

  • 对Python中创建进程的两种方式以及进程池详解

    在Python中创建进程有两种方式,第一种是: from multiprocessing import Process import time def test(): while True: print('---test---') time.sleep(1) if __name__ == '__main__': p=Process(target=test) p.start() while True: print('---main---') time.sleep(1) 上面这段代码是在window

  • Python中引用传参四种方式介绍

    目录 引用传参一: ​引用传参二: ​​引用传参三: ​​引用传参四: 总结 引用传参一: ​​>>> a = 100 #这里的a是不可变类型 >>> def test(a): ... a+=a #这个式子有两层含义:1.这里可能是重新定义一个新的变量a,2.也有可能是修改a的值,但由于全局 #变量a不能修改,所以此处是重新定义了一个a: ... print("函数内:%d"%a) ... >>> test(a) 函数内:200 &

  • Python中os模块的12种用法总结

    目录 一.先总结,再详谈 二.详谈各种方法的使用 1.getcwd() :返回当前工作目录 2.chdir(path) :改变工作目录 3.listdir(path) :列举指定目录中的文件名和目录名 4.mkdir(path) :创建单层目录 5.makedirs() :递归创建目录 6.remove(path) :删除文件 7.rmdir(path) :删除单层目录 8.removedirs() :递归删除目录 9.system(command) :运行系统的shell命令 10.renam

  • python中列表添加元素的几种方式(+、append()、extend())

    目录 1.使用+加号 2.使用append()方法 3.使用extend()方法 4.难点 1.使用+加号 +加号是将两个list列表相加,返回一个新的列表对象,会消耗额外的内存. #!/usr/bin/env python # -*- coding:utf-8 -*- if __name__ == '__main__': a = [1, 2, 3] b = [4, 5, 6] c = a + b print(c) 输出: [1, 2, 3, 4, 5, 6]Process finished w

  • python中添加模块导入路径的方法

    python中自定义模块导入路径的方式主要有以下3种: (1)使用sys.path.append()随着程序执行,会动态地添加模块导入的路径,但是程序执行结束后就会立即失效(临时性的) import sys sys.path.append('自定义路径') (2)加入到环境变量PYTHONPATH用于当前用户 在用户主目录下有一个 .bashrc 隐藏文件,打开文件 sudo vim ~/.bashrc 添加单个路径的方法 export PYTHONPATH=<自定义路径>:$PYTHONPA

  • 详解Python中matplotlib模块的绘图方式

    目录 1.matplotlib之父简介 2.matplotlib图形结构 3.matplotlib两种画绘图方法 方法一:使用matplotlib.pyplot 方法二:面向对象方法 1.matplotlib之父简介 matplotlib之父John D. Hunter已经去世,他的一生辉煌而短暂,但是他开发的的该开源库还在继续着辉煌.国内介绍的资料太少了,查阅了一番整理如下: 1968 出身于美国的田纳西州代尔斯堡. 之后求学于普林斯顿大学. 2003年发布Matplotlib 0.1版,初衷

  • 一文详解Python中实现单例模式的几种常见方式

    目录 Python 中实现单例模式的几种常见方式 元类(Metaclass): 装饰器(Decorator): 模块(Module): new 方法: Python 中实现单例模式的几种常见方式 元类(Metaclass): class SingletonType(type): """ 单例元类.用于将普通类转换为单例类. """ _instances = {} # 存储单例实例的字典 def __call__(cls, *args, **kwa

随机推荐