用实例来说明进口的作用吧。
创建以下包结构。一个文件夹cookFish/⑾旅姘礁鑫募?<代码> __init__ . py 代码>和<代码> cookBook.py> 代码。
为什么取这几个名字呢?假设我想用Python去做和鱼相关的菜,这件事情很复杂,所以我给它创建了一个包,名叫cookFish,既然是包,在它下面必须得创建一个文件__init__。py。烧鱼必备条件之一就是菜谱,所以接着创建了食谱。py。这几个文件对我们这次来说就足够了,所以就没有再创建其他文件了。
cookFish/__init__ . py cookBook.py
在cookFish/__init__。py中输入如下代码:
__version__=' 0.1 ' __author__='谢拜伦' def cookFish_hello (): 打印(“cookFish_Hello()从cookFish/__init__ . py”)
在<代码> cookFish/食谱。py> 代码中输入如下代码:
def cookBook_hello (): 打印(“cookBook_hello()从cookBook.py”)
提示:下面的实例都是在Python自带的命令行解释器(windows + Python 3.7)中运行的结果。如果你在其他环境下运行,比如jupyter笔记本,输出会有差异。
导入包cookFish。
<代码>祝辞祝辞祝辞进口cookFish 代码>
提示:
如果进口时出现错误ModuleNotFoundError,如下:
在在在进口cookFish 回溯(最近的电话): 文件“& lt; stdin>”,1号线& lt; module> ModuleNotFoundError:没有模块命名“cookFish”
建议先将Python的当前工作目录设置为cookFish的父文件夹(就是包含cookFish文件夹的文件夹)。命令如下:
在在在进口操作系统 在在在os.chdir父母(r 'path \ \ \文件夹\ \ cookFish”)
用dir操作查看当前命名空间和cookFish命名空间下都有哪些内容。
祝辞祝辞的在dir() #查看当前命名空间下的对象。注意:cookFish在当前命名空间下。
(‘__annotations__’,‘__builtins__’,‘__doc__’,‘__loader__’,‘__name__’,‘__package__’,‘__spec__’,‘cookFish’, '系统'],
祝辞祝辞的在dir (cookFish) #查看cookFish命名空间下的对象。
(‘__author__’,‘__builtins__’,‘__cached__’,‘__doc__’,‘__file__’,‘__loader__’,‘__name__’,‘__package__’,‘__path__’,‘__spec__’,‘__version__’,‘cookFish_hello]
其中的的<代码> __author__, __version__, cookFish_hello 代码>是我们定义的,都导入到了cookFish的命名空间下。但是cookFish下的模块<代码>食谱。py> 代码没有被导入。这是因为直接进口cookFish <代码> 代码>只运行cookFish文件夹下的<代码> __init__。py 代码>文件,不会运行其他模块,所以菜谱没有被导入。
提示:Python中的模块指后缀. py的文件,也叫脚本。包指包含__init__。py文件的一个文件夹,一般还会包含其他模块。
这里讲一下我对概念”在cookFish的命名空间下”的理解。
Python的导入会把Python的代码运行一遍,并把运行结果放在一个叫一个的命名空间下。
一个是提示:如果包,Python的代码就是文件夹一个下的__init__。py中的代码。如果一个是模块,那么就是文件。py中的代码。
进口B会把B的Python代码运行一遍,并把运行结果放在一个叫B的命名空间下。假设A和B中都有一个叫X的对象,一个中的X在当前命名空间下叫。X、B中的X在当前命名空间下叫B.X,两个X在当前命名空间下不重名。
提示:这里的对象指Python中的变量/属性,函数,类,实例等等。
比如__version__属性(或者叫它变量)就在cookFish的命名空间下,我们只能通过cookFish。__version__才能访问到__version__,直接输入__version__访问不到它,会报错。
直接输入__version__运行会报如下错误:
在在在__version__ 回溯(最近的电话): 文件“& lt; stdin>”,1号线& lt; module> NameError:名字“__version__”没有定义
如果我们想导入cookFish下的模块食谱呢?可以用下面的语法: