Python入门
DAY 16
今日内容:模块循环导入,区分python文件的两种用途,模块的搜索路径(相对路径和绝对路径),软件开发的目录规范
1.模块循环导入问题
循环导入是在模块之间的,但是模块的循环导入不一定会出错
举一个错误的例子:
有一个模块m1和模块m2代码如下
-
#模块m1
-
print('正在导入m1')
-
from m2 import y
-
x='m1'
-
#模块m2
-
print('正在导入m2')
-
from m1 import x
-
y='m2'
错误原因:m1会在自身代码没有全部执行之前,进入了m2的代码体,然而这时m2中的导入的m1的x值是没有在m1的名字空间创建的,所以会报错:cannot import name 'x'
解决这个问题有两种方法
方法一:将导入模块的代码放在赋值变量之后,这样就可以在进入m2之前,创建x,那么在m2中就能导入m1的x了
代码如下:
-
#模块m1
-
print('正在导入m1')
-
x='m1'
-
from m2 import y
方法二:利用函数定义阶段只检测语法不执行的特性来解决这一问题
代码如下:
-
#模块1
-
print('正在导入m1')
-
def func1():
-
from m2 import y
-
x='m1'
2.区分python文件的两种用途
文件被执行和文件本导入
python编写的文件中有一个__name__的内置函数
当在m1中运行此代码print(__name__)就会返回一个值为__main__,说明这个文件被执行了
-
#m1.py
-
print('run')
-
print(__name__)
当做run.py文件中导入m1时,那么m1中的print(__name__) 返回的就是m1(模块名),也就是说明了m1文件被导入了
-
#run.py
-
import m1
3.模块的搜索路径https://www.douban.com/doulist/109595436/
导入模块的搜索路径有3个 先是搜索内存 其次搜索内置模块 最后搜索sys.pyth
sys是一个内置的模块 sys.pyth是系统的一个环境路径我们可以通过以下代码得出sys.pyth的路径内容
-
#run.py
-
import sys
-
print(sys.path)
会得到一个路径列表
一般来说,基于sys.pyth中的路径去搜索的都为绝对路径
绝对路径
我们说一个文件导入另一个文件只需要 import 模块名 列如: 在run.py 中 可以通过 import m1 就可以导入模块m1 可以使用m1的功能,但是这是基于2个文件处于同一文件夹下时可以这样导入 但是
如果m1放在和run.py同级的dir1的文件夹下我们要如何去导入m1?
我们可以通过二种方式实现
方式一:import dir1.m1 在导入的模块前加上模块上级文件的文件名即可
方式二:我们可以在sys.path中添加模块所在的文件名称,这样导入时就能找到dir1下的模块m1
-
#run.py
-
import sys
-
sys.path.append(r'E:\python\oldboy_py_03\8月\day16\03 模块的搜索路径\dir1')
-
import m1
相对路径https://www.douban.com/doulist/109595436/
相对路径是通过 . 的方式, 一个 '.' 表示在当前目录 二个 '..' 表示当前文件上级目录 三个 '...' 就是表示当前文件上级目录的上级目录 以此类推
注意:相对路径导入是不能用在执行文件的,只能用在模块中去导入其他模块
例:m1 和 m2 在同一文件目录下,那么m1 可以 通过 from . import m2 来导入m2 ,注意:2个模块如果在包中的话,这样写就会出错
4.软件开发的目录规范
例:按照软件开发的目录规范,为图书管理系统建立一套规范的目录结构,并总结个目录结构的功能
bin 用于存放可执行文件
conf 用于存放配置文件,全局性的变量之类
lib 库文件,用于存放自定义的模块和包
core 用于存放核心逻辑代码
log 用于存放日志文件
db 用于存放数据库信息,数据库操作
Readme 是软件说明之类的软件信息