• Day 4-1 模块的导入方法和路径


    什么是模块?

    在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

    为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。

    使用模块有什么好处?

    1. 最大的好处是大大提高了代码的可维护性.
    2. 使用模块还可以避免函数名和变量名冲突.

    模块分类

    模块分为三种:

    • 内置标准模块(又称标准库)执行help('modules')查看所有python自带模块列表
    • 第三方开源模块,可通过pip install 模块名 联网安装
    • 自定义模块

    模块调用

    import module
    
    from module import xx
    
    from module.xx.xx import xx as rename  
    
    from module.xx.xx import *
    

    注意:模块一旦被调用,即相当于执行了另外一个py文件里的代码

    自定义模块

    这个最简单, 创建一个.py文件,就可以称之为模块,就可以在另外一个程序里导入.

    当调用一个模块时,python到底从哪儿去找被调用的模块呢?

    import sys
    print(sys.path)
    
    # python会到sys.path输出的目录里去寻找被调用的模块.如果找不到被调用的模块,就会报错.

    安装第三方模块:

    1.在python交互模式下,进入到要安装的模块目录下.运行 python3 setup.py bulid. 运行结束后,再运行一次 python3 setup.py install  一般模块就安装成功了.默认安装在python安装目录下的libstie-packages

    删除一个安装的模块.pip3 uninstall 模块名.

    2. 在线安装模块.默认可以使用pip install 模块名  来安装.但是对于大体积的模块,会很慢,因为要从国外下载.建议使用豆瓣源下载安装.

    --trusted-host pypi.douban.com是信任豆瓣源.不然安装不了.
    pip install -i http://pypi.douban.com/simple/ alex_sayhi --trusted-host pypi.douban.com   #alex_sayhi是模块名

    包的概念:

    当你的模块文件越来越多,就需要对模块文件进行划分,比如把负责跟数据库交互的都放一个文件夹,把与页面交互相关的放一个文件夹,像这样,一个文件夹管理多个模块文件,这个文件夹就被称为包.下面就是一个包

     

    模块导入:

    1 from crm import views   # 调用级别目录下的模块.
    2 import views   # 这样导入的时候,会到python的环境变量里去找views文件,由于当前目录并不在环境变量中,所以会报错.
    3 
    4 # 注意,在上面的目录结构不变动的情况下,在python2中运行上面的导入模块目录会出错,在python2,组成包还有一个必不可少的文件'__init__.py'.
    如果没有这个文件,python2默认这个'包'只是一个文件夹.python的包可以没有"__init__.py"这个文件.但是为了规范,python3也请建立一个__init__.py的文件.内容可以为空.

    思考一个问题.如果我想从views里面调用proj里面的setting.py.该怎么实现呢?

    # 在views.py中添加调用代码
    from proj import settings
    # 我们运行一下manager.py.发现竟然没有报错.这是为啥呢?
    #注意了.当我们运行manager.py的时候,manager.py的当前路径已经加入到到python的环境变量中了.
    当我们在views中调用settings的时候,其实是在manager的目录下,找到proj中的settings,在调用的.

    上面是可以通过views调用proj下面的settings.但不是我想要的结果.我想直接从views里调用.就是说views是入口程序了.那又该怎么实现呢?

    # 第一种方法.就是把my_proj这个目录添加到sys.path的环境变量中.
    import sys
    sys.path.append('D:My DocumentsPycharmProjectsOldBoychapter4-常用模块packagesmy_proj')
    # 上面这种方法是可以用了.但是发现一个问题.如果我把这个文件发给别人,那么别人就无法执行了.因为这个绝对路径是我电脑自己的路径.别人电脑上的路径不可能和我的完全一样.
    #第二种方法.既然我们的程序已经写好了项目目录层级.那么我们程序的目录结构是肯定不会再改变了.那么我们是不是只要获取我们程序目录前面的路径就可以了?
    import sys
    print(dir()) # 打印dir(),我们发现有一个__file__的文件.我们打印输入看看是什么
    print(__file__)
    #输出:
    # D:/My Documents/PycharmProjects/OldBoy/chapter4-常用模块/packages/my_proj/crm/views.py
    #原来就是我们当前运行程序的路径.
    BASE_ADDRESS = os.path.dirname(os.path.dirname(__file__))
    print(BASE_ADDRESS)
    sys.path.append(BASE_ADDRESS)  # 把上面的路径添加到环境变量中,再执行下面的调用,就不会报错了
    from proj import settings
    #这样我们就获取了程序的根目录.os.path.dirname(),会认为路径的最后一项是一个文件,就会把它去掉.

    上面我们终于实现了在views中调用proj下面的settings.真爽呀.赶紧去python里执行试试.哼着小曲,啃着鸡爪.就去敲代码了.一执行程序,我擦.报错了.鸡爪也没心情吃了.为啥会报错呢?

    我们来找找原因.

    '''我们打印一下print(__file__)
    发现路径变成了'views.py'.原来这个__file__获取的是程序运行的当前路径.并不是绝对路径,只是一个相对路径.
    想要获取绝对路径,只能通过os.path.abspath(__file__)
    然后再脱掉2层目录,就到了程序的根目录了.'''
    BASE_DRESS = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DRESS)
    print(BASE_DRESS)
    #输出:
    # D:My DocumentsPycharmProjectsOldBoychapter4-常用模块packagesmy_proj

    再去python里试试.终于没有报错了.这次可以安安心心的啃鸡爪了.

    from . import models
    from ..proj import settings
    '''
    在linux中,可以通过"."表示上层目录 ".."表示上层目录的上一层.
    
    文件夹被python解释器视作package需要满足两个条件:
    
    1.文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。
    2.不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)。
        所以这个问题的解决办法就是,可以把manager.py往上移动一层就好了.
    
    
    '''    
  • 相关阅读:
    python学习之老男孩python全栈第九期_day015知识点总结
    python学习之老男孩python全栈第九期_第二周学习总结
    python学习之老男孩python全栈第九期_day016作业
    python学习之老男孩python全栈第九期_day014知识点总结
    监听文件输入的例子
    python学习之老男孩python全栈第九期_day013知识点总结
    python学习之老男孩python全栈第九期_day015作业_老男孩Python全9期练习题(面试真题模拟)
    python学习之老男孩python全栈第九期_day014作业
    python学习之老男孩python全栈第九期_day011作业
    python学习之老男孩python全栈第九期_day008作业
  • 原文地址:https://www.cnblogs.com/lovepy3/p/8724190.html
Copyright © 2020-2023  润新知