**循环导入问题** 循环导入问题.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')