如何在python 中导入 package

package 在 python 中,是一种有效组织代码,module 可以是一个文件,可以通过 import 来导入一个 module 单个文件,而 package 则是作为一个目录来导入。随后我们还会看一看多层嵌套是如何导入的。

>>> import collections,socket
>>> print(collections.__path__)
['/anaconda3/envs/py38/lib/python3.8/collections']
>>> print(socket.__path__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'socket' has no attribute '__path__'

我们看一看 python 提供标注库,例如 collections 和 socket,这里 collections 是一个 package 也就是意味着其是一个目录,在 python 文件,而 socket 则是一个 module,对于 socket 和我们之前介绍导入 module 一样。package 与 module 不同就是具有 __path__ 属性,我们可以通过 __path__ 来访问到存放 python 文件的路径。但是对于 module 并不存在这个属性。

在 python 中,有两种 package,分别是是 regular package 和 namespace package。

regular package:

我们首先来看一看 regular package,下面是一个 regular package 结构

main.py
pkg1
---__init__.py

在项目下,我们创建一个文件夹 kpg1 下面有一个文件 __init__.py,这样 package 就是 regular package,这样这个文件夹的名称就是一个 package 名称,我们导入 package 就可以直接导入这个 package 名称。在 __init__.py 文件里添加如下语句.

print("importing pk1")
def hi_say():
    print("pkg1 say hi")

在 main.py 我们导入 package 也就是 import pkg1,python 通过 finder 来定位到 package 位置,pathFinder 通过在 sys.path 中的 path 搜索来定位到 package 的位置。大家还记得吗? sys.path 第一个 path 就是我们当前目录,这是为什么 python 可以定位到 pkg1 ,就是根据,当我们导入 package python 就会自动执行 package 下面的 __init__.py 文件。当你 import package 时,module 的编译好 code 对象,我们可以通过 pkg1.hi_say() 来。

print(pkg1.__path__)

通过 pkg1 的 __path__ 来方法 pkg1 的目录绝对路径。

print(pkg1.__file__)

而 __file__ 对应得到 __init__.py 文件的绝对路径。

print(pkg1.__package__)

也可以通过 package 的 __package__ 的属性获取 package 的名称,同样可以通过 __name__ 来获取 module 的名称。

接下来我们进一步加大难度,就是 pkg1 文件夹下再新建一个 mod1.py 文件

main.py
 pkg1
 ---__init__.py
 ---mod1.py

__init__.py 文件

print("importing pk1")

mod1.py 文件中,输出一条"import mod1"的信息,还定义了 say_hi 函数,接下来我们想要做的事导入这个 module 然后执行其中 say_hi 方法。

print("importing mod1")
def say_hi():
    print("pkg1 say hi")
import sys
import pkg1

print('pkg1' in globals())#True
print('pkg1' in sys.modules)#True

我们导入 pkg1 这样创建一个指向 module 对象的引用,然后添加全局变量中,同时作为 module 也会被添加到 sys.modules 缓存中。

然后当我们直接通过 pkg1.mod1 来访问 mod1 module 会抛出下面错误,告诉用户并不存在这个属性

AttributeError: module 'pkg1' has no attribute 'mod1'

也就是只是简单导入 package 并不会将其下的 module 一同导入,所以才会出现上面错误。如果想要导入 pkg1 下 mod1 我们需要使用 import pkg1.mod1 这样正确方式来导入 mod1

import sys
import pkg1.mod1

大家注意一下当我们导入 mod1 正确方式是用 import pkg1.mod1,从下面输出来看,python 先执行 __init__.py ,也就是说 python 会先导入 package pkg1 然后再导入 module1 这样顺序。

importing pk1
importing mod1

如果下面方式可以访问到 module mod1 中的 say_hi() 方法。

pkg1.mod1.say_hi()
print('pkg1' in sys.modules)#True
print('pkg1.mod1' in sys.modules)#True
print('pkg1' in globals())#True
print('pkg1.mod1' in globals())#False

通过上面输出我们发现 pkg1 和 pkg1.mod1 都存在于 sys.modules 缓存中,还有不难看出只有 pkg1 位于全局变量,我们只能通过 pkg1 的属性来方法 mod1。

简单总结一下,我们要方法一个 package 下的 module,首先会访问这个 package 会执行 package 下的 __init__.py 然后再去执行 module 代码,在 sys.modules 保存 pkg1 和 pkg1.mod1 分别指向保存两个 module 对象的内存地址。

到此这篇关于 如何在python 中导入 package 的文章就介绍到这了,更多相关在 python 中导入 package 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 中的 module 和 package

    接着如何在python 中导入 package的分享,这一次是在 package 下继续嵌套一个 package , 项目目录如下: pkg1 ---__init__.py ---mod1.py ------pkg2 ---------__init__.py ---------mod2.py import pkg1.pkg2.mod2 我们尝试将 mod2 进行导入,这一次将先导入 pkg1 然后 pkg2 最后导入 mod2 import pkg1 import pkg2 import mod

  • 浅谈Python中文件夹和python package包的区别

    pycharm右键新建时会有目录(文件夹)和python package两个选项,这两个到底有什么不同呢 1.原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有__init__.py那么它就是这个包的子包了. 当你将一个包作为模块导入(比如从 xml导入 dom)的时候,实际上导入了它的__init__.py 文件. 2.而目录跟包唯一不同的就是没有__init__.py 文件,一个包是一个带有特殊文

  • python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py

    安装完 anaconda 运行如下代码执行不了 import numpy as np import os,sys #获取当前文件夹,并根据文件名 def path(fileName): p=sys.path[0]+'\\'+fileName return p #读文件 def readFile(fileName): f=open(path(fileName)) str=f.read() f.close() return str #写文件 def writeFile(fileName,str):

  • Python--模块(Module)和包(Package)详解

    目录 一.模块的导入 1.什么是模块(module) 2.模块有什么作用 3.模块的分类 4.什么是包(package) 5.import/fromimport导入 6.使用名字导入 7.制作包与模块 8.同一个模块重复导入 9.相对导入 10.模块查找顺序 二.Python下划线 1.制作包与模块 2.下划线的特殊含义(模块) 三.文件与模块执行过程 四.模块打包与发布 1.如何分享模块 2.如何使用别人的模块 3.setuptools工具 五.软件目录结构规范 1.定义目录结构目的 2.软件

  • 详解python如何引用包package

    python中引用包的方法: python中引用包可以使用"import 包名"语句引用包 示例:引入time import time 也可以用"from 包名 import 类名"的方式引用包 示例:引入time.time类 from time import time 内容扩展: 什么是Python Package 如何区分你看到的目录是一个Python Package包呢?其实很简单,你只要看这个名录下是否有"__init__.py"这个文件

  • 如何在python 中导入 package

    package 在 python 中,是一种有效组织代码,module 可以是一个文件,可以通过 import 来导入一个 module 单个文件,而 package 则是作为一个目录来导入.随后我们还会看一看多层嵌套是如何导入的. >>> import collections,socket >>> print(collections.__path__) ['/anaconda3/envs/py38/lib/python3.8/collections'] >>

  • 如何在Python中导入EXCEL数据

    目录 一.前期准备 二.编写代码基本思路 三.编写代码读取数据 3.1 3.2 四.结语 一.前期准备 此篇使用两种导入excel数据的方式,形式上有差别,但两者的根本方法实际上是一样的. 首先需要安装两个模块,一个是pandas,另一个是xlrd. 在顶部菜单栏中点击文件,再点击设置,然后在设置中找到以下界面,并点击“+”号. 然后会出现以下界面,在搜索框中分别搜索以上两个模块:pandas/xlrd. 选中搜索出来的模块,并点击左下角的的安装按钮,便可将模块安装到自己电脑中. 需要注意的是,

  • 如何在python中实现线性回归

    线性回归是基本的统计和机器学习技术之一.经济,计算机科学,社会科学等等学科中,无论是统计分析,或者是机器学习,还是科学计算,都有很大的机会需要用到线性模型.建议先学习它,然后再尝试更复杂的方法. 本文主要介绍如何逐步在Python中实现线性回归.而至于线性回归的数学推导.线性回归具体怎样工作,参数选择如何改进回归模型将在以后说明. 回归 回归分析是统计和机器学习中最重要的领域之一.有许多可用的回归方法.线性回归就是其中之一.而线性回归可能是最重要且使用最广泛的回归技术之一.这是最简单的回归方法之

  • 分析如何在Python中解析和修改XML

    目录 一.什么是XML? 二.Python XML解析模块 2.1.xml.etree.ElementTree模块 2.2.xml.dom.minidom模块 一.什么是XML? XML代表可扩展标记语言.它在外观上类似于HTML,但XML用于数据表示,而HTML用于定义正在使用的数据.XML专门设计用于在客户端和服务器之间来回发送和接收数据.看看下面的例子: 例子: <? xml version ="1.0" encoding ="UTF-8" ?>

  • 教你如何在Pycharm中导入requests模块

    1.找到python的安装路径: 如果忘记可以在Pycharm运行如下代码: import sys pythonpath = sys.executable print(pythonpath) 路径如下: 2.打开CMD: 转到python路径下的Scripts文件夹下: 3.输入要下载的PiP命令:pip install requests 等待下载,出现Successfully,,,,则下载成功 4.出现错误的解决办法: 如果出现如上图错误,则继续在CMD上运行: 1.输入语句"pip3 ins

  • 如何在Python中隐藏和加密密码示例详解

    目录 前言 maskpass() 安装: askpass(): advpass(): base64() 在输入时间内隐藏用户密码 总结 前言 有多种 Python 模块用于隐藏用户输入的密码,其中一个是**maskpass()模块.在 Python 中,借助maskpass()模块和base64()**模块,我们可以在输入时使用星号(*) 隐藏用户的密码,然后借助 base64() 模块可以对其进行加密. maskpass() maskpass() 是一个 Python 模块,可用于在输入期间隐

  • 如何在Python中妥善使用进度条详解

    目录 1 简介 2 tqdm常用方法 2.1 基础用法 2.2 配合jupyter notebook/jupyter lab的美观进度条 2.3 配合pandas中的apply 3 alive-progress常用方法 总结 1 简介 在日常运行程序的过程中常常涉及到循环迭代过程,对于执行时间很短的程序来说倒无所谓,但对于运行过程有明显耗时的涉及循环迭代的程序,为其加上进度条(progress bar),是帮助我们监测代码执行进度以及处理中间异常错误非常实用的技巧. 本文就将为大家介绍Pytho

  • 如何在Python中引用其他模块

    目录 一.前言 二.导入和使用标准模块 三.第三方模块的下载与安装 一.前言 在Python中,除了可以自定义模块外,还可以引用其他模块,主要包括使用标准库和第三方模块.下面分别进行介绍. 二.导入和使用标准模块   在Python中,自带了很多实用的模块,称为标准模块(也可以称为标准库),对于标准模块,我们可以直接使用import语句导入到Python文件中使用.例如,导入标准模块random(用于生成随机数),可以使用下面代码: import random # 导入标准模块random 说明

  • 如何在Python中利用matplotlib.pyplot画出函数图详解

    目录 0.引言 1.绘图 (1)导入所需库 (2)设置函数 (3)plt.figure() (4)plt.plot(),plt.axhline(),plt.axvline(),plt.axhspan(),plt.axvspan() (5)设置 x,y 轴的数值范围 (6)设置 x,y 轴的标题文本 (7)设置图例和标题 (8)plt.show() 2运行结果 总结 0.引言 为了让用户能够使用python时,方便地绘制 2D 图表,PYTHON的模块中提供Matplotlib模块中所含的子库py

  • 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 包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成

随机推荐