写点什么

一文带你轻松了解 Python 导入模块的各种命令

发布于: 2020 年 10 月 17 日

Python 代码,一般第一行代码都是 import *或 from * import *,作用是导入功能模块,然后利用模块内的函数编写代码,减少大量的代码编写时间,是 python 的一大特色。但是,在实际写码过程中,初学者往往因对 import * 处于一知半解,导致经常出现一些莫名其妙的问题,严重影响学习心情和效果。本文特对此进行详细解读,帮助避坑。



导入的是什么?


用 import *导入时,*代表的是模块,也就是说,import 导入的是模块,不是包、类、函数


用 from * import *时,第一个*代表的也是模块,第二个*代表的则是模块内的类或函数。意思是从模块里导入其中的某个函数或类。具体下面有详解。


什么叫模块


模块是含有类或函数的 py 文件,也就是说,我们写的每一个 py 文件,都是模块。只不过专门的模块文件里面必须有函数或类,而我们一般写的 py 文件,是直接写功能代码,不一定需要有函数或类。举个例子:


不含函数直接写功能代码的 Py 文件:

print('hellow')


运行结果:hellow


含函数的功能模块 Py 文件:

def print():

print('hellow')if__name__=="__main__":

print()


运行结果:hellow


其中,def 打印()就是定义名为“打印”的函数。通过 if __name__ == "__main__":在本模块文件内调用“打印”函数,执行函数内的“print('hellow')”代码。



将上面含函数的功能模块 py 文件取文件名为“试验”,保存后得到“试验.py”文件,就是一个可供其他 py 文件导入调用的模块。调用方法为:


import 试验试验.打印()


运行结果:hellow,注意调用是文件后缀.py 不要写,只写文件名。


另一种调用方法为:


from 试验 import 打印打印()


运行结果:hellow,from 试验 import 打印:意思就是从“试验”模块文件里导入“打印”函数到本文件,导入后,就可直接使用函数名,函数名前面不加模块名。


专门用作模块的 py 文件,一般没有 if 语句,只能被调用,独自不能运行。比如上面的“试验.py”文件,如果我们删掉 if 语句,变成下面的代码:


def 打印():print('hellow')


直接运行得不到 hellow 的结果,用上面的两个调用方法,则不受影响。



什么叫函数


通过上面的例子,我们不仅知道了 py 文件都是模块文件,而且知道了在调用模块时,最终使用的是模块文件里的函数,比如上面案例里的“打印”就是函数。所以,函数其实就是包含了具体功能代码,用 def 函数名()定义的功能代码块。


在模块导入方面,类的性质和函数是一样的,只不过类有其专有的属性和方法,此处不细讲。


什么叫包


我们知道了 import * 后面的 * 号代表的都是模块,但有时候我们会遇到这种用法:


import tkinter.filedialog

tkinter.filedialog.askopenfilenames(filetypes=[('excel文件','.xlsx')])


import 后面代码的中间有个小点,这就是导入包内模块的用法:小黑点前面是包的名称,后面是包含在包内的模块名称。


tkinter:就是一个功能包,包内含有多个子包或模块。


filedialog:是包含在 tkinter 包内的其中一个模块。


askopenfilenames:是包含在 filedialog 模块内的其中一个函数。


初学者有时候依葫芦画瓢会弄成这种用法:


import filedialog.askopenfilenames


这就是误将函数作为模块进行导入了,程序会报错。如果真想导入 askopenfilenames 函数,可用 form import 用法,但注意,模块名必须带上包名,写成下面的样子:


from tkinter.filedialog import askopenfilenames


若漏了包名:from filedialog impor taskopenfilenames,也会报错


了解这些概念和用法后,严格按这个用法,基本就没有问题了。但有时也会遇到报错,这是因为模块导入顺序的问题。


模块分类


python 的模块函数分 4 类:


1、python 自带函数:不需进行 import 导入可直接使用,比如 print()函数,就是直接用。


2、python 标准函数库:安装 Python 时,会随带着安装一些标准函数,在 python 安装路径下的 lib 文件夹里,打开 lib 文件夹会发现很多 py 文件,这些就是标准函数,通过 import 导入后就可使用。



3、第三方库:有很多功能强大的模块函数,没有在标准库里,比如操作 excel 用到的 openpyxl 模块。这时用 import 导入时,会提示找不到这个模块文件。需要将其提前下载安装到 lib 文件夹里,然后再导入。下载方法为:打开 cmd,输入 pip install openpyxl,回车即可。


4、自己写的 py 文件模块:自己写的含有 def 函数的 py 文件,可作为模块导入使用。前面的含有打印函数的试验.py 文件,就是使用自建模块的例子。


import test

test.print()


模块导入顺序


我们知道,python 标准库里有很多模块文件,比如下面的这个文件:



其实这是我自建的一个模块文件,功能是拆分合并 excel 文件。导入该功能模块后,拆分或合并 excel 文件的代码为:

import cfjoin

import tkinter.filedialog as a

if__name__=="__main__":

ff=a.askopenfilenames(filetypes=[('excel文件','.xlsx')])

cfjoin.breakfile(ff)#拆分选中的excel文件


在运行时,上面的代码有时候可以,有时候却报错,对新手来说,这是很费解的。但其实,问题很简单。检查一下,是不是运行的 Py 文件所在文件夹里是否也存在一个与导入的模块文件同名的 cfjoin.py 文件,如果有,而且这个文件里的内容与 lib 文件夹里的 cfjoin.py 内容不同。则运行时会报错,如果没有、或者与 lib 文件夹里的 cfjoin.py 完全相同,则运行正常。这就是模块导入顺序造成的问题。



python 导入模块时,不是直接从 lib 库里导入,而是先从当前 py 文件所在文件夹里找需要导入的模块文件,找到后则导入使用;如果没找到,再到 lib 文件夹里找,如果还没找到,则提示未找到。如果当前文件夹下某个 py 文件名正好与 lib 库里的模块文件同名,则会导入当前文件夹下的 py 文件而不是导入 lib 库里的模块文件,导致出错。避免的方法就是将自己写的 py 文件取名不要与一些常用 lib 库模块文件同名。


另外,python 导入模块时只从当前文件夹下和 lib 库里导入,如果模块文件放在其他位置,则会提示找不到模块。移到当前文件夹或 lib 库中任何一个位置就可以了,如果是成熟的 py 功能文件,最好放在 lib 库里,可以避免编辑器误报错误。


比如,我上面的 cfjoin.py 文件,如果我将其放在当前文件夹下,删掉 lib 库里的该文件,上面的拆分 excel 表格代码运行功能没任何问题,但编辑器里会报错:



虽然是误报错,但对强迫症患者来说,看到那些黄波浪号会很不好受。这时,我们将 cfjoin.py 文件移到 lib 库里就可以了。



看完别走还有惊喜!

我精心整理了计算机/Python/机器学习/深度学习相关的 2TB 视频课与书籍,价值 1W 元。关注微信公众号“计算机与 AI”,点击下方菜单即可获取网盘链接。


用户头像

微信公众号:计算机与AI 2020.09.19 加入

数据科学科班出身,专注分享计算机和人工智能相关知识。

评论

发布
暂无评论
一文带你轻松了解Python导入模块的各种命令