Python中包/模块的“进口”操作代码

  

用实例来说明进口的作用吧。

  

创建以下包结构。一个文件夹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文件夹下的<代码> __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下的模块食谱呢?可以用下面的语法:
  

     

Python中包/模块的“进口”操作代码