• 1
  • 1
分享
  • Python模块与包的详细解读和使用
  • 饭团🍙 2020-09-22 14:03:32 字数 3442 阅读 1630 收藏 1

   模块和包的定义

图1.png


  模块的定义:任何  *.py  的文件都可以当作模块使用  import  导入

  包的定义:包含一个__init__.py和其他模块、其他子包的一个目录

  实际项目中,所谓的包和模块分别代表什么,如下:

  包就是指 test

  模块就是 do_excel.py , http_request.py , run.py

图2.png


  我们以上面这个目录讲解,在 run.py 文件中导入各个包的方式

  导入单个test包

 import test

  导入report、log包

   # 同时导入,用逗号隔开,墙裂推荐import report, log
  # 分开导入import reportimport log

  导入单个test包,并起别名

 import test as t

  导入report、log包,并都起别名

 import report as r, log as l

  导入project包下的old包

 import project.old

  导入project包下的old包下的test包

   # 方式一:链式调用import project.old.test
  # 方式二:from .. import ..from project.old import test

  到这里先总结下知识点

  import后面跟的包名也是单位变量名(自己取的方便理解)

  什么意思?以上面old包下的test包举例

  场景:假设我要调用test包下的 test.py 里面的 run() 方法

  如果用的是方式一,就得这样写

 project.old.test.test.run()

  而方式二,则是这样写

 test.test.run()

  可以看到import后面跟什么“变量”,当你要调用包、模块里面的东西时,你就得先写“变量”再调用包名、模块名

  我们可以再来看看下面的总结

  import:完全导入

  from .. import ..:部分导入(针对性导入)

  怎么区分它们的意思捏?我们来看看哈;在根目录下的 test 包下的 run.py 代码如下

   #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  num =1
  floats = 2.22
  strs = "字符串"def sum():
  print("我是sum")
  class test():
  def test(self):
  print("test class")

  假设,在项目中其他文件中想调用 run.py 下的变量、函数名、类名

  导入其他模块的变量、函数名、类名

  方式一:import方式

  导入的是 run 模块里面所有内容(包括变量、函数、类名),但是还是得通过 test.run 去链式调用

   import test.run# 调用num变量print(test.run.num)  # 输出1
  # 调用sum方法print(test.run.sum())  # 输出 我是sum

  有些小伙伴就想问,难道我不能指定变量、函数名、类名吗?让我们来试试

   #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  import test.run.num
  # 调用num变量print(test.run.num)

     首先,如果你用的是Pycharm,在import最后的num会报黄,hover上去会提有提示 No module named num

  然后,运行下文件会报错如下

   Traceback (most recent call last):
  File "F:/test/tests.py", line 5, in <module>
  import test.run.num,test.run.floats
  ModuleNotFoundError: No module named 'test.run.num'; 'test.run' is not a package

  错误的大概意思就是: test.run.num 不是一个模块名, test.run 不是一个包

  可以看到import的完全导入意思就是:导入最小单位是模块,而不是变量、函数名、类名

  方式二:from .. import ..

   # from 包名.模块名 import 变量/函数/类名from test.run import num     from test.run import sumfrom test.run import testssfrom test.run import floats
  if __name__ == '__main__':
  print(num)
  print(sum())
  print(testss().test())
  print(floats)

  执行结果

   1
  我是sum
  test class
  2.22

  可以看到from .. import .. 的部分导入意思就是:导入最小单位可以是模块,也可以是变量、函数名、类名

  导入模块的方法

  根据上面讲的知识,如果要导入模块有两种方式,一个就是 import 模块名 一个就是 from 包名 import 模块名

  导入test包下的run模块

   # importimport test.run
  # fromfrom run import test

  导入test包下的run、tests模块

   # importimport test.run,test.tests
  # fromfrom run import test,tests

  特别知识

  提问:import 包/模块,包和模块是从哪里导入的?

  回答:我们是通过 sys.path 所包含的路径列表你下,按顺序查找的

  怎么理解?

  在Pycharm工程下敲以下代码

 import sysprint(sys.path)

  执行结果

 ['F:\\moocInterface\\test', 'F:\\moocInterface', 'D:\\PyCharm 
 2019.3.1\\plugins\\python\\helpers\\pycharm_display', 
 'D:\\python3.6\\python36.zip', 'D:\\python3.6\\DLLs', 'D:\\python3.6\\lib', 
 'D:\\python3.6', 'D:\\python3.6\\lib\\site-packages', 'D:\\python3.6\\lib\\site-packages\\django-2.1.5-py3.6.egg', 'D:\\python3.6\\lib\\site-packages\\pytz-
 2018.9-py3.6.egg', 'D:\\PyCharm 2019.3.1\\plugins\\python\\helpers\\pycharm_matplotlib_backend']

   可以看到:

  1.当前文件所在路径是放在第一位

  2.工程路径放在第二位

  3.Pycharm相关路径放在第三位

  我们从系统cmd进入Python解释器敲以下代码,查看结果

 >>> import sys>>> print(sys.path)

  结果如下

 ['', 'D:\\python3.6\\python36.zip', 'D:\\python3.6\\DLLs', 'D:\\python3.6\\lib', 'D:\\python3.6', 
 'D:\\python3.6\\lib\\site-packages', 'D:\\python3.6\\lib\\site-packages\\django-2.1.5-py3.6.egg', 
 'D:\\python3.6\\lib\\site-packages\\pytz-2018.9-py3.6.egg']

  结论:

  我们在Pycharm下import的包、模块,优先会在工程目录下寻找,找不到才会从Python默认安装路径下找


作者:小菠萝   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   谷歌要推出类似ChatGPT的聊天机器人了。不仅和ChatGPT进行了对比测试,还测试了一种新的问答式搜索界面。谷歌(108.8, 7.37, 7.27%)CEO皮查伊还将其称为“搜索伴侣”(a companion to search),目的很明确。  Gmail的缔造者保罗?布赫海特(Paul Buchheit)在社交媒体上发文,表达了对谷歌有可能被ChatGPT之类的聊天机器人取代的担忧。  他说,正像谷歌搜索当年取代黄页那样,谷歌搜索一两年内也有可能被ChatGPT取代。  谷歌赚钱的最大法门就在于搜索引擎的结果展示页面(信息分发),而ChatGPT的横空出世会改变这个页面展示方式。...
            0 0 536
            分享
          •   不久之前,小米公司发言人发表《关于小米汽车相关恶意泄密及谣言的声明》,媒体“ZAKER”员工包某某、“小白买车”员工关某某未经许可有意泄露保密拍摄内容,小米将追究两人及所属媒体泄密责任。  时间来到 12 月 20 日,这两家当事媒体也都在社交平台上贴出了自己的致歉声明。“ZAKER”方面表示,该公司汽车事业部员工包某某在 12 月 17 日受邀参与的品鉴拍摄活动期间,误将此前小米汽车在工信部公示的照片当成其他媒体同场拍摄的素材,并错误认为小米汽车允许公开发布拍摄的照片。  于是,其出于个人目的,将三张带有小米汽车的工作“花絮”擅自在其个人微信朋友圈发布。经现场工作人员提醒,包某某意识到事...
            0 0 411
            分享
          •   在测试行业,一个一直被讨论的问题就是:手工测试没有前途,自动化测试会取代手工测试?  首先说结论:自动化测试不会取代手工测试,这完全是两个维度的事情。为什么不会呢?我们需要从本源上说起。  什么是自动化  世界上有很多职业,比如艺术家、维修人员、销售等等,每种职业都需要人来参与,而每种职业也都有部分工作交给机器来做。  但无论哪种职业,几乎都是人来主导,然后将越来越多的工作交给机器来做,而机器无法实现的工作,比如创新、情感、思维等,只能由每个具体的人来完成。而这些必须由具体的人来完成的事情,我们称之为“手工”,机器完成的部分,我们称之为“自动 化”。  因此,手工、自动化不是测试专属的概念...
            0 0 572
            分享
          • 最近有个同事问:一个功能API自动化做了,UI自动化还需要做吗?刚接到这个问题的时候我愣了一下。因为这两个自动化主要覆盖的场景完全不同。为啥是互斥的?一般情况下:这2个都是需要的。打个比方:过滤沙子的时候,不同颗粒度的沙子就需要不同类型的滤网去过滤。首先我们看下UI自动化优点:它主要覆盖场景就是用户使用场景。模拟用户操作来进行自动化。根据用户操作方法来使用脚本替代用户操作。一般是在功能测试后期代码稳定后实现。UI自动化缺点:UI自动化缺点也很明显,依赖开发UI界面的稳定性。所以UI自动化相对来说比较脆弱,维护成本比较高。运行时间长,质量反馈稍微有点慢。而且脚本需要添加等待时间来模拟页面操作后台...
            0 0 565
            分享
          •   移动开发平台(Mobile PaaS,简称mPaaS)是源于支付宝App的移动开发平台,为移动开发、测试、运营及运维提供云到端的一站式解决方案,能有效降低技术门槛、减少研发成本、提升开发效率,协助企业快速搭建稳定高质量的移动App。  目前越来越多的应用基于MPaaS平台开发,对于测试人员而言,这带来了全新的挑战。本文将聚焦于mPaaS平台下的移动端自动化测试的体验。  一、mPaaS应用的自动化测试体验  本次测试的软件为某款移动办公型App,它的安卓端和苹果端均基于mPaaS平台开发, H5使用了Kylin框架。主要应用了Nebula H5容器、定位、社交分享、扫码及部分UI组件。Ap...
            0 0 726
            分享
      • 51testing软件测试圈微信