python的包和模块,Python中的包

  python的包和模块,Python中的包

  什么是模块? py文件是一个模块。

  我们不会在开发过程中将所有代码都写在一个. py文件中。随着代码量的增加,函数或类可以存储在不同的。py文件按照它们的功能。

  这样使得代码更便于后期管理和维护,也方便其他程序调用当前实现的函数~

  在开发过程中,我们经常会参考其他模块,比如time、os、configparser、re等等。

  Python中通常有三种类型的模块:

  1)Python内置模块

  2)第三方模块

  3)自定义模块

  模块的导入语句模块的导入语句如下:

  导入模块1[,模块2[,moduleN]

  或者

  导入模块1

  导入模块2

  .

  进口moduleN用哪种方式看个人习惯。导入模块后,可以通过模块名直接调用模块中的方法或类。方法()~

  导入时间

  Time.time() # time()是时间模块中的方法。

  1545832129.4365451

  导入日期时间

  Datetime . datetime . now()# datetime是datetime模块中的类。

  日期时间。DateTime (2018,12,26,21,49,2,805953)当我们使用import语句导入模块时,Python解释器会先在内置名称空间中查找,即判断导入的模块是否是内置模块(例如Time模块是Python内置模块),然后到sys.path列表中定义的路径中查找。py文件从前到后。

  以下是个人笔记本上的sys.path输出列表:

  #输出的pycharm:

  [/Users/baby/PycharmProjects/untitled/module ,

  /Users/baby/PycharmProjects/untitled ,

  /usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 37 . zip ,

  /usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 3.7 ,

  /usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 3.7/lib-dyn load ,/usr/local/lib/python 3.7/site-packages ,

  /Applications/py charm . app/Contents/helpers/py charm _ matplotlib _ back end ]

  #终端输出:

  sys.path

  [ ,/usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 37 . zip ,

  /usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 3.7 ,

  /usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 3.7/lib-dyn load ,

  /usr/local/lib/python 3.7/site-packages ]可以看到pycharm中sys.path的输出与终端中略有不同。在pycharm中,pycharm会自动将当前项目的路径添加到sys.path列表的前面。所以如果当前路径中存在与要导入的模块同名的文件,要导入的模块就会被屏蔽~

  sys.path列表中某个路径下的文件如下:~ ls/usr/local/cellar/python/3 . 7 . 1/frameworks/versions/3.7/lib/python 3.7

  LICENSE.txt文件输入. py回复

  __未来_ _。py fnmatch.py reprlib.py

  _ _ phello _ _ . foo . py formatter . py rl completer . py

  .

  .

  导入的过程现在我自己编辑了一个模块sftp,内容如下:

  server_ip=192.168.0.30

  def获取文件():

  打印(下载文件.)然后导入到main.py文件中(路径与sftp.py相同):

  导入sftp

  导入sftp时,Python解释器会先创建一个新的命名空间,用来存储SFTP模块中定义的名称,然后在这个命名空间中执行sftp.py文件。

  例如,现在在sftp模块中添加一条打印语句,然后执行main.py文件:

  # sftp.py

  server_ip=192.168.0.30

  def获取文件():

  打印(下载文件.)

  打印(你好…)

  #主页. py

  导入sftp

  #执行main.py后,会有以下输出:

  你好.import语句可以理解为定义一个变量,变量指向对应的命名空间。通过使用这个变量,可以引用命名空间中的方法和变量~

  导入SFTP后,注意区分新创建的名称空间和当前名称空间。示例如下:

  # sftp.py

  server_ip=192.168.0.30

  def获取文件():

  打印(下载文件.)

  #主页. py

  导入sftp

  server_ip=1.2.3.4

  打印(服务器ip)

  打印(sftp.server_ip)

  #执行main.py后,会有以下输出:

  1.2.3.4

  192.168.0.30注意sftp.py中的server_ip和main.py文件中的server_ip位于不同的命名空间,所以同名不会冲突;当然,称呼的方式也不同。当前文件中的server_ip可以直接引用,sftp模块中的server_ip需要用模块名引用。变量名(sftp.server_ip)

  还需要注意的是,如果一个模块在当前文件中多次导入,那么模块中的代码只会执行一次,不会执行多次。那是因为第一次导入,模块中的方法和变量已经加载到内存中,后续的导入就不会重复加载了~重命名模块为了方便,在导入模块的时候也可以重命名模块;如果当前文件中存在同名的方法或变量,也可以通过这种方式避免冲突~

  将日期时间作为日期导入

  import from import中date.datetime.now()的语法如下:

  从modname导入name1 [,name2 [,namen]] import语句将创建一个新的名称空间,并将模块中的名称存储在该名称空间中,而 from modname import name1,name2 将name1和name2分别导入当前名称空间。由于是导入到当前命名空间,所以可以直接使用,不需要在前面加上模块名。

  从日期时间导入日期时间

  Print(datetime.now()) #不需要写成datetime.datetime.now()

  如果from … import导致名称被强调,将使用后面定义的那个。

  def foo():

  及格

  从演示导入foo

  #此处引用foo函数,将使用演示模块中的foo函数。

  #############

  从演示导入foo

  def foo():

  及格

  #此处引用了foo函数,将使用当前文件中foo函数的包。简单地说,Python中的包是一个目录。py文件存储,加上一个__init__.py,很多模块都是按目录组织的,用包来管理和分类模块。引入包后,还有一个好处就是同名的模块可以放在不同的包下,避免名字冲突~

  例如,现在有三个包,ROOT、pk_1和pk_2:

  m1的全称是:root . PK _ 1 . m1;m2的全称是:ROOT.pk_2.m2 ~

  init.py文件的作用就是应该有一个__init__。每个包目录中的py文件。如果这个文件不存在,那么这个目录只是一个目录而不是一个包。__init__。py文件可以是空文件,也可以是Python代码。原则是保持__init__。py文件尽量简洁~

  导入的语句如下:

  导入包

  #或者在包下引入一个模块。

  无论是从包导入模块导入包还是从包导入模块都会执行包包下的__init__文件。

  现在有以下目录结构:

  ROOT

   pk_1

   __init__.巴拉圭

   m1.py

   pk_2

   __init__.巴拉圭

   m2.py

   __init__.巴拉圭

  _ _ init _ _。test.pypk_1和pk_2包中的py文件都是空的。根包下的test.py想要使用pk _ 1包下m1模块中的方法,可以使用下面的语句:

  从pk_1导入m1

  M1.fun_1() # fun_1()是M1模块中的一个方法,但是如果使用下面的语句,就会抛出异常:

  从pk_1导入*

  m1.fun_1()

  #异常信息:

  名称错误:未定义名称“m1”

  ##############################

  导入主键_1

  pk_1.m1.fun_1()

  #异常信息:

  错误:模块 pk_1 没有属性 m1 。此时,您可以在__init__中升级软件包。pk_1包中的py(升级包中的导入权限)。__init__的内容。PK _ 1包中的py文件如下:

  从pk_1.m1导入fun_1然后在test.py文件中,可以通过包名直接引入方法:

  # 1)

  从pk_1导入fun_1 #或从pk_1导入*

  fun_1()

  # 2)

  导入主键_1

  pk_1.fun_1()

  这就是__init__存在的意义。这个包中的py文件。您可以编写相关的导入语句或语句来增强__init__中的导入权限。py文件,让用户在不知道包内部结构的情况下,通过包名直接调用这个包中某个模块的方法~

  还可以使用_ _ all _列出要在__init__中导入的模块。py文件包中,比如在__init__中添加__all__变量。pk_1包中的py文件:

  __all__=[m2]然后在test.py文件中,可以使用from pk_2 import *将__all__变量中列出的模块导入一次:

  从pk_2导入*

  M2.fun_2()如果__init__。pk_2包的py文件改进了fun_2方法:

  \_\_init\_\_。包# pk_2的py内容

  从pk_2.m2导入fun_2,在test.py中导入*后可以直接使用这个方法:

  从pk_2导入*

  Fun_2()注意:在__init__中定义__all__变量时。py,import *将只导入__all__中列出的模块

  包中的模块调用现在具有以下目录结构:

  log

   util

   __init__.巴拉圭

   a.py

   b.py

   __init__.巴拉圭

   test.py在测试中介绍模块a:

  从util导入a将b模块引入a模块:

  在这种情况下,import将在执行测试文件时报告一个错误。Modulenotfounderror:没有名为“B”的模块表明找不到B模块。

  这是因为在执行测试时,sys.path中的路径不包含util下的路径,所以在a.py文件中导入B模块时会报错(如果直接执行a.py文件就不会有问题)。将模块B引入模块A的正确方法是:

  从util导入b当然,此时a.py文件已经不能单独运行,运行时会报错。

  提示:使用a.py文件中的 from util import b 来导入模块b,如果此时直接执行a.py文件,会得到一个错误,因为a.py文件本身位于util路径下,sys.path中有一个util路径(执行a.py时为sys.path)。但是 from util 找不到util,只有当util位于sys.path的一个路径中时 from util 才能找到util ~

  现在,如果主可执行文件本身位于项目目录下的一个包中,为了从其他包中引入模块,您需要在os.path中添加一个路径来实现这一点:

  现在可执行文件在bin目录下是bin.py。在bin.py中,应该导入util包中的模块A和B。为了确保通用性,可以使用以下方法获取日志路径并将其添加到os.path中:

  导入系统、操作系统

  sys.path.insert(0,OS . path . dirname(OS . path . dirname(OS . path . ABS path(_ _ file _ _)))

  from util import a _ _ name _ _ variable _ _ name _ _是像__file__一样的内置变量。这个变量记录了当前文件(使用__name__变量的文件)是作为模块运行还是作为主执行文件运行~

  示例:

  A.py文件内容

  打印(__name__)

  #直接执行a.py文件并输出:

  # __main__

  现在在b.py文件中导入一个。b . py文件的内容如下:

  导入a

  #现在运行b.py文件(这个过程将运行a.py文件)并输出内容:

  # a ##是a的模块名。该函数通常用于代码调试:

  if __name__==__main__ :

  Pass可以在if语句中编写被调试的代码来调试当前py文件中的代码,因为__name__变量的值是__main__通过直接运行当前文件。外部模块调用时,不会执行if语句的内容,因为外部模块调用__name__变量的值就是模块名~

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: