模块循环导入问题,区分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期\aaa\bbb')
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期\day17\ATM\conf\settings.py
BASE_DIR=os.path.dirname(os.path.dirname(__file__)) # D:\python全栈15期\day17\ATM\
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\n" % (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自动生成日志