zoukankan      html  css  js  c++  java
  • 模块循环导入问题,区分py文件的两种用途,模块的搜索路径与查找优先级

    一、模块循环导入问题

    # run , m1, m2的循环导入

    #run.py
    x=1
    # import m1
    # print(m1.x)
    # print(m1.y)
    # m1.f1()
    
    import m2
    m2.f2()
    #m1.py
    print('正在导入m1')
    def f1():
        from m2 import y
        print(x,y)
        
    x='m1'
    #m2.py
    print('正在导入m2')
    def f2():
        from m1 import x
        print(x,y)
    
    y='m2'

    二、区分py文件的两种用途

    1、直接运行
    2、被当作模块导入
     #run1.py
    import spam

     #spam.py

    def f1():
        print('spam.f1')
    
    def f2():
        print('spam.f2')
    
    # print(__name__)  # 当文件被当作脚本直接执行时,__name__值为"__main__"
    # print(__name__)  # 当文件被当作模块导入时,__name__值为"模块名"
    
    if __name__ == '__main__':
        print("文件被当作脚本执行时要做的事情")
        f1()
        f2()def f1():
        print('spam.f1')
    
    def f2():
        print('spam.f2')
    
    # print(__name__)  # 当文件被当作脚本直接执行时,__name__值为"__main__"
    # print(__name__)  # 当文件被当作模块导入时,__name__值为"模块名"
    
    if __name__ == '__main__':
        print("文件被当作脚本执行时要做的事情")
        f1()
        f2()

    三、模块的搜索路径与查找优先级

    1、先从内存中已经导入的模块里找

    import mmm
    mmm.f1()
    
    import time
    time.sleep(15)
    
    print('='*50)
    import mmm
    mmm.f1()

    2、然后再查找内置的模块

    import sys
    print(sys.modules)
    
    import sys
    print(sys.path)
    
    # 当前执行文件所在的文件夹
    import logging
    print(logging)

    3、最后去sys.path列表中存放的多个文件夹里依次检索

    # 示例1:
    import sys
    print(sys.path)
    sys.path.append(r'D:python全栈15期aaabb')
    
    import ccc
    
    ccc.f1()
    
    # 示例2:
    import sys
    print(sys.path)
    import aaa.bbb.ccc as c
    c.f1()
    
    from aaa.bbb import ccc
    ccc.f1()

    四、软件开发的目录规范

     

    ps:在公司里面一般会直接创建一个项目,start.py会直接放在根目录下,这样用起来更加方便

    #执行文件bin---->start.py------ps:只要短短几行,不要长篇写代码
    from core import src
    src.run()

    #配置conf---->settings

    import os
    print(__file__)  # D:python全栈15期day17ATMconfsettings.py
    
    BASE_DIR=os.path.dirname(os.path.dirname(__file__))  # D:python全栈15期day17ATM
    log_path = os.path.join(BASE_DIR,'log','access.log')

     ps:__file__指的是当前文件的绝对路径

      os.path

      sys.path

      os.environ把想要在全局看的加载到环境变量

    #核心代码core---->src.py

    from lib import common
    
    def shop():
        print("购物功能")
        common.logger("xxx购买了一堆垃圾")
    def repay():
        print("支付功能")
        common.logger("fzh支付了100亿")
    def withdraw():
        print('提现')
        common.logger("fzh提现了200亿")
    
    
    func_dic = {
        '1': [shop, "购物功能"],
        '2': [repay, "支付功能"],
        '3': [withdraw, "提现功能"],
    }
    
    
    def run():
        while True:
            for k in func_dic:
                print('%s---%s' % (k, func_dic[k][1]))
    
            choice = input("请输入您的操作编号/输入0退出: ").strip()
            if choice == '0':
                break
            if choice in func_dic:
                func_dic[choice][0]()
            else:
                print('指令错误,请重新输入')

    #共享文件夹lib---->common.py

    import time
    from conf import settings
    
    def logger(msg):
        with open(settings.log_path, mode='at', encoding='utf-8') as f:
            log_format = "%s %s
    " % (time.strftime('%Y-%m-%d %H:%M:%S'), msg)
            f.write(log_format)

    #数据---->db

    #日志文件log---->自动生成access.log

     五、ATM购物车文件

    程序的说明文件 --->readme
    程序的入口文件/启动文件--->start.py
    配置文件夹conf --->settings.py
    公共方法文件lib --->common.py
    接口文件夹interface--->user.py用户接口文件
    --->shop.py购物接口文件
    --->bank.py银行接口文件
    用户功能文件夹core --->scr.py视图文件
    数据处理文件夹db --->da_handler.py数据处理功能文件
    日志存放目录log --->access.log自动生成日志
  • 相关阅读:
    微信公众平台开发者中心安全模式消息体加解密实现
    AES对称加密算法原理
    Token验证失败
    PaySignKey
    UVA 11732
    lua中的pairs和ipairs差别
    【shell学习笔记】curl命令总结
    视频监控系统:C/S & B/S
    Android app开发中用户协议(使用条款)文字自己主动换行
    uva 10154
  • 原文地址:https://www.cnblogs.com/guojieying/p/13373203.html
Copyright © 2011-2022 走看看