python模块学习__day01
-
模块的定义
在 python 中一个
.py
文件就是一个模块 -
模块的组成
python 的模块由变量、函数定义、类定义、可执行语句……
-
自定义模块
- 模块不宜过大。如果一个模块过大就要进行拆分。
- 模块中的可以包含变量、函数定义、类定义……
- 模块在使用前需要使用
import package_name
导入 - 在一个文件夹下新建模块时,要先新建一个
__init.py__
文件(为什么???)
-
模块的导入
# module01.py 和 test_import.py位于同一文件夹下
import test_import
# test_import.py当中定义了show_me()
# 通过test_import.show_me()调用show_me()方法
test_import.show_me()
在使用 import package_name
将模块导入时,模块中的所有可执行语句(python解释器可以直接执行,如函数调用)都会立马执行
为了在导入模块时,不运行源文件中的测试代码,可以通过文件的__name__
属性来进行判断。当以脚本形式(python filename.py
)执行源文件时,__name__ == '__main__'
;在作为模块(import package_name
)导入时,__name__ == 'package_name'
。
# function definition or class definition
if __name__=='__main__':
#testing code
- 在不同文件夹下
# module01.py 和 test_import01.py位于不同的文件路径下
# method 1
import modules.test_import01.py
# method 2
# 将test_import01.py的路径添加到sys.path中、
import sys, os
# 获得当前工作目录
cwd=os.getcwd()
path=cwd+os.sep+'modules'+os.sep+'test_import01.py'
sys.path.append(path)
-
python 解释器在导入模块时的搜索路径:
-
已经导入到内存中的模块。使用
import package_name
导入的,记录在sys.modules
中 -
当前目录。
-
内置模块。
Lib
和site_packages
目录下的模块 -
PYTHONPATH.
-
sys.path. 实现搜索路径的动态添加。
-
# 实现了将一个目录下的所有非空目录及其子非空目录的路径添加到sys.path中的操作
'''
将path目录下的dir全部筛选出来
'''
def dir_filter(path):
dir_list=[]
for file in os.listdir(path):
'''
将file转换为绝对路径
'''
file=path+os.sep+file
'''
判断file是否为目录
'''
'''
另一种解决方案
判断file是否为文件
若是:弹出
否则:留下
'''
if os.path.isdir(file):
dir_list.append(file)
yield from dir_list
# print(os.listdir('test_empty'))
'''
将一个目录下的目录,递归的添加到sys.path中
root_path为绝对路径
'''
def add_to_sys_path(root_path):
'''
is_empty
'''
flag=0
if not is_empty(root_path):
# 将root_path下的所有目录添加到sys.path中
# 如果当前目录下只有文件
sys.path.append(root_path)
flag=1
if not only_file(root_path):
for file in dir_filter(root_path):
add_to_sys_path(file)
return flag
'''
测试path目录是否为空
空:True
否则:False
'''
def is_empty(path):
return not bool(os.listdir(path))
'''
测试当前目录是否只有文件
'''
def only_file(path):
return not bool(dir_filter(path))
__file__
可以显示当前文件的绝对路径
# 在module模块中运行
print(__file__)
# 结果:E:\python_work\modules\module01.py
# 其作用等价于os.path.abspath(file)
print(os.path.abspath('module01.py'))
print(os.path.abspath('module01.py'))
# 不过需要注意的是,使用os.path.abspath(file)的结果是os.getcwd()+file, 可能并不是文件的真实绝对路径