模块循环导入问题,区分py文件的两种用途,模块的搜索路径与查找优先级,软件开发的目录规范

Posted guojieying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块循环导入问题,区分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(rD: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

 

以上是关于模块循环导入问题,区分py文件的两种用途,模块的搜索路径与查找优先级,软件开发的目录规范的主要内容,如果未能解决你的问题,请参考以下文章

第六篇 模块基础

模块,循环导入

从模块到python文件的两种用法

Python文件的两种用途

模块简介模块的两种导入语句导入文件的补充判断文件类型模块的查找顺序

13.模块