网络编程
位置:首页>> 网络编程>> Python编程>> Python中导入模块的几种方式总结

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

作者:流浪猪头拯救地球  发布时间:2023-08-04 17:03:54 

标签: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.自定义模块与所需要调用自定义模块的文件在同一文件夹下

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

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

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

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

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

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

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

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

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

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

在这个时候,想导入哪一个文件的话就只需在文件开头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所包含的路径

来源:https://blog.csdn.net/Gou_Hailong/article/details/125169752

0
投稿

猜你喜欢

  • 下面,我们就从当前时间来取得随机数,调用的时候用包含文件就可以了:<!--#INCLUDE VIRTUAL="/q
  • 追本溯源,从使用开始首先看一下我们通常是如何使用微软自带的认证,一般在Startup里面配置我们所需的依赖认证服务,这里通过JWT的认证方式
  • 大名鼎鼎的FCKeditor终于在最近发布新版本了,与增加版本号不同,这次完全把它改名了,更名为CKeditor。这应该是和它的开发公司CK
  • 本文只讨论Oracle中最常见的索引,即是B-tree索引。本文中涉及的数据库版本是Oracle8i。 一. 查看系统表中的用户索引 在Or
  • 这段后门代码可以隐藏在asp文件中,大家可以搜索一些特点的关键字,查看文件的修改日期,看看是不是有如下的代码。<%if re
  • 在产品开发中,由UED发起的项目越来越多,但是现在的问题是很难为其设定商业价值的目标。如果没有明确的商业价值目标,很多公司根本没办法花大成本
  • 前言在做项目中,网站前台或者后台有些数据需要在多个视图页面使用,例如用户基本信息数据,菜单展示数据。首先想到的是在每个控制器里传入这些需要的
  •    【代码示例】 [code=SQL] DELIMITER   $$ DROP   FU
  • 这篇论坛文章着重介绍了Access数据库出现0x80004005问题的解决方法,更多内容请参考下文:项目做了三个月了,终于也差不多完成了,昨
  • 英文原文:http://www.usabilitypost.com/2009/04/15/8-characteristics-of-succ
  • 在Microsoft OfficeAccess和 Microsoft OfficeExcel之间存在多种交换数据的方法。若要将Access中
  • 1.查看mysql上都有哪些库mysql> show databases \G***************************
  • 一直一来,我都在想办法看能不能用 col 控制表格的列隐藏,但是无奈,FF对COL支持不够好(其实是以前没有发现COL在FF下要怎么弄)。今
  • 查了查《VBSCRIPT 速查手册》InstrRev的用法:InstrRev函数,功能:返回某字符串在另一个字符串中出现的从结尾计起的位置语
  • 以下的文章主要向大家介绍的是实现MySQL远程访问的实际操作流程,以及在实现MySQL远程访问的过程中哪些的相关事项是十分重要的,以下就是文
  • 简介Closure所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭
  • 设计师常常使用一些独特的字体效果和页面效果,阴影是其中一个,它可以让页面中的文字和元素具有立体的效果,从而被突出出来。比如对于文字阴影,传统
  • rs.open sql,conn:如果sql是delete,update,insert则会返回一个关闭的记录集,在使用过程中不要来个rs.c
  • 即text-overflow:ellipsis,需要配合white-space:nowrap使用。运行代码:<div style=&q
  • 说到排序,我想起一个故事,大意是说唐僧师徒西游美利坚,孙悟空买了本词典,开始逐条背诵单词。他们第一次下美国馆子的时候,不管服务员推荐什么,孙
手机版 网络编程 asp之家 www.aspxhome.com