循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包

**循环导入问题**

循环导入问题.py文件

import m1
print(m1.current_user)
m1.login()
print(m1.current_user)

m1.py文件

from m2 import f2
import os

def login():
    while True:
        inp_user = input('username>>>: ').strip()
        inp_pwd = input('password>>>: ').strip()

        if inp_user == 'egon' and inp_pwd == '123':
            print('登录成功')

            os.environ['username'] = inp_user
            break
        else:
            print("登录失败")

m2.py文件

import os
def f2():
    print('==============>f2')
**模块的搜索路径与优先级**

1、内存
2、内置模块
3、sys.path

例1
import m3
import time

m3.f3()
time.sleep(10)
 
import m3
m3.f3()   #把文件从文件夹里删除10s内还能运行,之后运行会报错

例2
import time  #触发的其实是内置函数,不会触发time.py文件

创建time.py文件 
print('自己的time模块') # 路径在sys.path
# 自己设置的模块名不要跟内置的冲突

例3:(有点麻烦)
import sys   
#添加对应文件夹绝对路径到sys.path成为解锁路径之一
 就可以访问不在当前路径下的文件
sys.path.append(r'D:\代码\aaa')
sys.path.append(r'D:\代码\bbb')
sys.path.append(r'D:\代码\ccc')

import m4
import m5
import m6

m4.f4()
m5.f5()
m6.f6()

import m4   #m4.py文件内容(路径 D:\代码\aaa)
m4.f4()

import m5   #m4.py文件内容(路径 D:\代码\bbb)
m5.f5()

import m6   #m4.py文件内容(路径 D:\代码\ccc)
m6.f6()

例4:(优化例子3)
import sys
# sys.path.append(r'D:\全栈18期\day16\代码')

from aaa import m4
from bbb import m5
from ccc import m6

m4.f4()
m5.f5()
m6.f6()

例5:
**重要结论:**如果被导入的模块是在执行程序所在的文件夹下,那么无需处理环境变量,
以执行程序所在的文件夹为起始点进行查找即可

**强调:**
1、导入语句中的点
# 如果是起始位置那个点代表当前文件夹(相对导入只能在**包**里用)
# 点的左边必须是个文件夹
# 如果是中间位置那个点代表的是路径分割符
2、使用语句中的点代表的是问某一个名称空间要名字

# "\"路径分隔符在windows系统中使用 
  "/"路径分隔符在linux和unix系统中使用
   pycharm统一用". "pycharm帮你区分
   导入语句的"."代表路径分隔符
   
#   ddd/eee/fff (go语言中用"/")
from ddd.eee.fff import m7

m7.f7()

# 当被导入的模块存在于执行程序所在文件下,此时没必要在处理环境变量了

例6:

import sys
sys.path.append(r'D:\day03')
import m8
m8.f8()

循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包

**软件开发目录规范(仅供参考,没有统一标准)**

假设我要开发一个叫ATM软件
ATM为*目录名字
# 执行程序放在bin(binary)下面
# corf 配置文件——》定制化的文件(比如产生的日志放在一个路径下面)
# core 核心代码 ,被导入的模块丢这里
# lib  共享一些功能 库(模块),自定义的库,存放功能的仓库
# logs 专门存放日志的文件夹
# readme 说明手册

bin目录下start.py文件

#执行程序放在bin下面
import sys
sys.path.append(r'D:\ATM')

from core.src import run

if __name__ == '__main__':
    run()

conf目录下settings.py

**知识点**

# print(__file__) 当前文件的绝对路径
# os.path.dirname(__file__)  返回脚本路径

**举例说明**

内容
import os  #导入标准库os(操作系统接口模块)
1. print(__file__)
2. print(os.path.dirname(__file__))
3. print( os.path.dirname(os.path.dirname(__file__)))

对应结果:
1. D:\PycharmProject\ATM\conf\settings.py
2. D:\PycharmProject\ATM\conf
3. D:\PycharmProject\ATM
# 配置文件——》定制化的文件(比如产生的日志放在一个路径下面)

import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

LOG_PATH = r'%s\logs\access.log' % BASE_DIR

# 配置路径写活了

core目录下src.py

from lib.common import log

def logout():
    print("退出".center(50,'*'))
    exit()

def login():
    print('登录'.center(50,'*'))
    log("egon刚刚登录了")

def register():
    print('注册'.center(50,'*'))

def transfer():
    print('转账'.center(50,'*'))
    #log("egon刚刚给刘sir转了10个亿")

def withdraw():
    print('提现'.center(50,'*'))

def pay():
    print('支付'.center(50,'*'))

func_dic = {
    '0': ['退出',logout],
    '1': ['登录',login],
    '2': ['注册',register],
    '3': ['转账',transfer],
    '4': ['提现',withdraw],
    '5': ['支付',pay],}

def run():
    while True:
        for k in func_dic:
            print(k,func_dic[k][0])

        choice = input("请输入指令编号: ").strip()

        if choice in func_dic:
            func_dic[choice][1]()
        else:
            print("输入的指令错误")

lib目录下common.py

import time
from conf import settings

def log(msg):
    with open(r'%s' % settings.LOG_PATH,mode='at',encoding='utf-8') as f:
        f.write("%s %s\n" % (time.strftime("%Y-%m-%d %H:%M:%S"),msg))

# 日志路径换成 配置文件可定制

python package

包含_int_.py文件的文件夹,被导入使用的
_int_.py文件 包的替代品,用来导入、包使用
表面上导包实际上就是在导_int_.py
文件夹当成一个模块,用文件夹组织一堆子模块,文件夹还可以当模块导入
包(xxx) xxx.名字,都来自于_int_.py文件

循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包

循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包

循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包

包的使用1

mmm.py

def f1():
    print('mmm.f1')

def f2():
    print('mmm.f2')

def f3():
    print('mmm.f3')

def f4():
    print('mmm.f4')

def f5():
    print('mmm.f5')

def f6():
    print('mmm.f6')

def f7():
    print('mmm.f7')

def f8():
    print('mmm.f8')

def f9():
    print('mmm.f9')

执行文件

import mmm

mmm.f1()
mmm.f2()
mmm.f3()

mmm.f4()
mmm.f5()
mmm.f6()

mmm.f7()
mmm.f8()
mmm.f9()

包的使用2

执行文件

import mmm

mmm.f1()
mmm.f2()
mmm.f3()

mmm.f4()
mmm.f5()
mmm.f6()

mmm.f7()
mmm.f8()
mmm.f9()

mmm.kkk()

int.py

from .m1 import f1,f2,f3
from .m2 import f4,f5,f6
from .m3 import f7,f8,f9

from .aaa.bbb.m4 import kkk

m1.py

def f1():
    print('mmm.f1')

def f2():
    print('mmm.f2')

def f3():
    print('mmm.f3')

m2.py

def f4():
    print('mmm.f4')

def f5():
    print('mmm.f5')

def f6():
    print('mmm.f6')

m3.py

def f7():
    print('mmm.f7')

def f8():
    print('mmm.f8')

def f9():
    print('mmm.f9')

循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包

循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包

循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包

循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包

循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包

上一篇:美团点评数据库高可用架构的演进与设想


下一篇:MySQL-MMM高可用架构