1 模块的循环导入问题
出现的问题
m1.py
print('m1')
from m2 import y
x='m1'
m2.py
print('m2')
from m1 import x
y='m2'
run.py
import m1
解决方案一:
将导入的代码放到程序的最后面
m1.py
print('m1')
x='m1'
from m2 import y
m2.py
print('m2')
y='m2'
from m1 import x
run.py
import m1
解决方案二:
将导入的模块的代码放到函数中
m1.py
print('m1')
def f1():
print('执行了f1')
from m2 import y
x='m1'
m2.py
print('m2')
def f1():
print('执行了f2')
from m1 import x
y='m2'
run.py
import m1
m1.f1
m1.x
m1.y
2 区分python文件两种用途
当文件被执行的时候:__name__='__main__'
但文件被调用的时候:__name__='模块名'
在自定义模块的最后加
if __name__ = '__main__':
功能名()
功能名()
3 模块的搜索路径
模块搜索路径的优先级:
1 内存中已经加载的
2 内置的
3 sys.path-------------第一个值是当前执行文件的所在目录
调用模块时如何查找路径
绝对导入
方案一:
import sys
sys.path.append('被调用模块的路径')
方案二:
from 第一级文件夹.第二级文件夹......... import 模块名
优点:执行文件和自定义模块都可以使用
缺点:必须以执行文件为准,导入麻烦
相对导入
参照当前文件为起始路径开始查找
符号 . 表示当前文件夹 ..表示上级文件夹 ...表示上级的上级文件夹
优点:导入简单
缺点(也是注意点):相对导入只能在模块中使用,被执行文件中不能使用相对导入
软件开发的目录规范:
ATM
bin 存放可执行文件(整个程序的入口)
conf 配置文件
lib 自定义模块文件
core 逻辑文件
log 日志文件
db 数据库文件
Readme 软件的说明