• 1
  • 1
分享
  • Python模块与包的详细解读和使用
  • 饭团🍙 2020-09-22 14:03:32 字数 3442 阅读 1820 收藏 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软件测试网原创

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   北京时间12月12日早间消息,据报道,最近,在美国匿名网络论坛“Blind”上,社交网络巨头Meta的员工们通过各种评论,炮轰掌门人扎克伯格。  许多评论发表于Meta宣布解雇13%员工决定的日子,一些评论内容负面,当然也有一些对扎克伯格正面评价。  论坛一位用户将Meta这一次大规模裁员比喻为“饥饿游戏”,另外一位用户则称,扎克伯格面临一个很不确定的未来。  据报道,Blind属于美国面向职场人士的网络社区服务,来自不同企业的员工可以发帖,表达对于雇主的不满或意见。  根据论坛资料,用户如果想在Blind发帖,需要提供企业的工作邮箱、现任职务、公司名称等信息,这样论坛可以了解发帖人的职场...
            0 0 995
            分享
          •   前言  面试的时候,经常会临场出题:给你一个xxx, 如何测试, 或者说如何写测试用例?xxx可以是圆珠笔,水杯,电梯等生活中常见的场景。  那么给你一个支付的二维码,如何写测试用例呢?  二维码扫码支付  如下图,给你这个个人收款的二维码,如何测试?  首先要知道什么是二维码? 二维码实际上就是一个 url 地址,当手机扫码后,会根据二维码上的黑和白(黑色的色素块代表1,白色的色素块代表0)区域解析成 url 地址。  然后再分析下使用场景,这里实际上涉及到一个收款方,一个支付方。收款方生成二维码,支付方拿着手机去扫码。  知道使用场景了,接着拆分功能点,从字面上"二维码扫码支...
            13 11 3664
            分享
          •   1、引言  在撸码过程中,99.1%的大佬,都不敢说自己的撸出来的代码,是不需要debug的。换句话说,码农在撸码过程中,最痛苦的,莫过于撸出来的代码,为了能避坑,小鱼也是在撸码过程中,总结的一点避坑方法,请各位大佬笑纳。  2、避坑内容总结  2.1无法定位到元素  遇到问题:  找不到元素,脚本报“NoSuchElementException:Unable to find element”,或"定位到了,不能操作,点击无效。  解决方法:  1)查看自己的“属性值”是否写正确  2)元素的标签不唯一,默认找到第一个  3)向上查看,元素是否在frame或iframe框架中  ...
            0 0 1465
            分享
          • 一、安全测试(1)SQL注入(比如登陆页面)(2)XSS跨网站脚本攻击:程序或数据库没有对一些特殊字符进行过滤或处理,导致用户所输入的一些破坏性的脚本语句能够直接写进数据库中,浏览器会直接执行这些脚本语句,破坏网站的正常显示,或网站用户的信息被盗,构造脚本语句时,要保证脚本的完整性。  document.write("abc")   <script>alter("abc")</script>(3)URL地址后面随便输入一些符号,并尽量是动态参数靠后(4)验证码更新问题(5)现在的Web应用系统基本采用先注册,后登陆的方式。因此,必...
            0 0 872
            分享
          • 1)测试计划与测试方案的区别:计划:属于组织管理层面的文档,从组织管理的角度对测试活动进行规划;方案:属于技术层面的文档,从技术的角度对测试活动进行规划。测试计划:对测试全过程的组织、资源、原则等进行规定和约束,并制定测试全过程各个阶段的任务分配以及时间进度安排,并提出对各项任务的评估,风险分析和管理需求。测试方案:描述需要测试的特性,测试的方法,测试环境的规划,测试工具的设计和选择,测试用例的设计方法,测试代码的设计方案。测试方案需要在测试计划的指导下进行,测试计划提出“做什么”,而测试方案明确“如何做”软件测试用例包括软件测试用例设计和写作。软件测试用例设计:是从设计层面考虑,比如从功能性...
            12 12 2105
            分享
      • 51testing软件测试圈微信