python中模块导入相关的一些知识和原理,走过路过不可错过哟!

在这里插入图片描述

之前有写过python -m的用法,其含义是将模块作为正常的python代码来执行,本文则主要介绍一下python模块相关的一些知识。


模块的含义

平常我们经常会使用到import os、import sys、from pandas import DataFrame等import方式来引入一些模块到代码中,对这些模块的引用使得python的功能变得非常强大。

实际上模块就是普通的python代码,其中有某些函数,某些类,某些属性等,在新建的脚本文件中为了便利我们的工作、避免重写某些模块内已存在的内容,只需要将这些python脚本作为模块导入到新建脚本中,即可在新建脚本中调用模块中已存在的类、函数、属性等来进行工作。

import 和from import 的区别

import和from import之间有较大的区别,使用import直接导入是直接将要导入的模块整个导入,在调用模块中的方法、类或属性时需要使用模块名.方法名模块名.类名模块名.属性名这样的方式。而from import则是调用某些被指定的方法、类或者属性,因此导入时不会占用太多内存,如from pandas import DataFrame只导入pandas的DataFrame方法,同时在使用时不需要使用pandas.DataFrame,而是直接DataFrame()即可。

在某些情况下使用如from pandas import *,这种方式表明导入模块中所有内容,但是在使用时不需要像以import方式导入的模块一样需要加上模块名,而是直接以被导入的模块中所规定的函数名等直接调用即可。

导入模块

导入已安装的python模块

这种方式最简单,因为已被安装的python模块一般都存在python的环境变量(注意不是系统的环境变量,而是python自己的变量)中,可以通过sys.path查看这些环境变量存在的位置,几乎都存在于python的lib文件夹下的几个文件夹中。

在某些情况下,还可以将自己的某些放在固定位置的脚本作为模块,只需要使用在sys.path列表中加入这个模块存在的文件夹的位置即可,如:

## 假设有个py文件为a.py,其绝对路径为"/home/name/hei/a.py"
import sys
sys.path.append("/home/name/hei/")
# 使用上面的语句后,即可使用import 导入a这个模块了
import a  # 应该不会报错的
# 不过这里只是在当前的python环境中改变了路径列表,下一次打开python时会恢复之前的路径

在同个文件夹下的脚本间的导入

我们自己平常写的python脚本间若需要相互调用,可以将两个脚本放在同个文件夹下,使用import方法即可导入另一个脚本并作为一个模块,使用方式与python中其它的模块的使用方式如import os相似,例如使用os.system等方法。如:
在这里插入图片描述

# b.py中可以直接写如下的代码导入new_module,但是注意一下new_module.py中
# 最好写if __name__ == '__main__',以避免被b导入后会执行某些代码。
import new_module
# 使用import new_module表示引入整个模块,在b.py中调用new_module中的属性或者函数时需要以
# new_module.func1()、new_module.class1()、new_module.attribute1()这样的方式来调用
# 这里可以调用其中的函数、类、属性等

这样的导入,在执行脚本后一般会产生一个__pycache__文件夹,这个文件夹也类似编译过的文件,这样下次在使用时不用再进行编译,从而提高脚本运行的效率。

在不同文件夹中的模块的导入

能看到github网站中很多成熟的python程序都是有好几个文件夹的,各个文件夹中都可能有一些python脚本,这样的目录结构是为了方便程序的管理和使用的,一般来说main文件夹是开启程序的起点,这里不多介绍程序的目录结构,这样的目录结构也可以使用cookiecutter上的一些成熟目录结构的模板来制作。

在有文件夹的存在下,脚本间的互相导入也是可行的,若细心观察的话,能发现在文件夹中会存在有__init__.py的存在,这里的__init__.py中不写任何内容也是可以的,比如在下面的目录中:
在这里插入图片描述
若是a.py要导入b.py作为模块,那么就需要有那个__init__.py的存在,才能够使用import test.b或者from test.b import *来进行导入。如:

import test.b
from test.b import *

而b.py中要导入a模块则可以将a.py存在的路径加入到sys.path列表中即可。这里读者可以自行尝试啊。

这里也可以和之前的python -m联系起来,python -m可以在test文件夹上级直接执行b.py,而不需要__init__.py的存在,因为python -m的作用就是将模块当做普通python文件来运行。

要将自己制作的模块打包发布的话,模块目录中还需要加入setup.py,这个可以参考手把手教你自己写一个Python模块,并将其发布并安装到自己的Python环境中去这篇文章,我也先不多解释了,有兴趣可以看看呀。

参考:http://www.360doc.com/content/18/0404/12/9824753_742781891.shtml
参考:https://blog.csdn.net/coolcooljob/article/details/80082907
参考:https://blog.csdn.net/liao392781/article/details/80496060

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值