[TOC]
dir 函数 --- 当前命名空间查看
不带参数时,返回当前当前命名空间的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
想要获取模块的所包含的方法,可以直接使用dir
这个函数
getattr -- 获取对象属性值
获取对象属性值 key 以字符串形式传入 和一般dir 连用
正常情况下我们是知道对象属性的,所以用A.a 形式,但在一些元编程或者框架构建方向往往是不知道传入对象有什么属性的,用这个方法可以得到对象属性加以利用
pkgutil
如果我要获取包中所有模块,直接使用dir
并没有获取
import os
import importlib
def get_modules(package="."):
"""
获取包名下所有非__init__的模块名
"""
modules = []
files = os.listdir(package)
for file in files:
if not file.startswith("__"):
name, ext = os.path.splitext(file)
modules.append("." + name)
return modules
if __name__ == '__main__':
package = "clazz"
modules = get_modules(package)
# 将包下的所有模块,逐个导入,并调用其中的函数
for module in modules:
module = importlib.import_module(module, package)
for attr in dir(module):
if not attr.startswith("__"):
func = getattr(module, attr)
func()
可以看到,我在只知道包名的情况下,成功获取了包下所有模块,和模块中所有的方法,并成功调用
注意,相对导入的时候需要在模块名前面加.
import pkgutil, clazz
for filefiner, name, ispkg in pkgutil.iter_modules(clazz.__path__, clazz.__name__ + "."):
print("{0} name: {1:12}, is_sub_package: {2}".format(filefiner, name, ispkg))
"""
FileFinder('/Users/qmp/myproject/mydemo/demo/allclass/clazz') name: clazz.a , is_sub_package: False
FileFinder('/Users/qmp/myproject/mydemo/demo/allclass/clazz') name: clazz.b , is_sub_package: False
"""
importlib
一个函数运行需要根据不同项目的配置,动态导入对应的配置文件运行。
和import 区别在导入对象是个表变量可以控制
import importlib
m = importlib.import_module("%s.%s" % (package_name, name))
结合在一起实现功能 flask 扫描包下所有模块,提取文件内所有方法找到对应方法并注册
import importlib
from functools import wraps
import pkgutil
from flask import Flask, Blueprint
from utils import *
import os
def register_blueprints(app, package_name, package_path):
rv = []
for _, name, _ in pkgutil.iter_modules(package_path):
m = importlib.import_module("%s.%s" % (package_name, name))
for item in dir(m):
item = getattr(m, item)
if isinstance(item, Blueprint):
app.register_blueprint(item)
rv.append(item)
return rv
这些其实也不属于常用包多用于元编程或者中级代码
shutil -文件拷贝工具
用于复制和归档文件和目录树的实用功能。
复制
# 复制文件
shutil.copyfile("diff.py", "diff_new.py")
# 复制文件对象
shutil.copyfileobj(open("diff.py","r"), open(""diff_new.py"","w"))
# 递归复制目录
shutil.copytree("/a", "/b")
# 复制目录
shutil.copy("/a", "/b")
迁移
# 迁移目录
shutil.move("/a", "/b")
删除
shutil.rmtree("/root/a"):递归的去删除文件