循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包
2021/8/15 23:06:33
本文主要是介绍循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
**循环导入问题** 循环导入问题.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')
这篇关于循环导入问题,模块的搜索路径与优先级,软件开发目录规范,包的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-04TiDB 资源管控的对撞测试以及最佳实践架构
- 2024-07-03万字长文聊聊Web3的组成架构
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现