Python实现插件机制——自动import一个目录下的所有.py文件
假设有这样一个目录结构:
/src
main.py
/plugins
__init__.py
a.py
b.py
c.py
d.py
要在执行import plugins语句时,自动import放在plugins目录下的所有.py文件。
可以在plugins目录下创建这样的一个__init__.py,遍历当前目录、并import找到的.py文件。
✖ 方案一:
from glob import glob
from keyword import iskeyword
from os.path import dirname, join, split, splitext basedir = dirname(__file__) for name in glob(join(basedir, '*.py')):
module = splitext(split(name)[-1])[0]
if not module.startswith('_') and \
module.isidentifier() and \
not iskeyword(module): __import__(__name__+'.'+module)
但是上述代码并不适用被zipapp打包的程序。在被zipapp打包时,globl()、os.walk()等函数在这里会失灵。
在使用zipapp时,我们需要pkgutil模块的帮助。把__init__.py换成这个就可以了,同样是遍历当前目录、并import找到的.py文件。
✔ 方案二:
import os
import pkgutil pkgpath = os.path.dirname(__file__)
pkgname = os.path.basename(pkgpath) for _, file, _ in pkgutil.iter_modules([pkgpath]):
__import__(pkgname+'.'+file)
代码更简洁、又能适用zipapp,这个方案不错。
Python实现插件机制——自动import一个目录下的所有.py文件的更多相关文章
- python 检索一个目录下所有的txt文件,并把文件改为.log
检索一个目录及子目录下所有的txt文件,并把txt文件后缀改为log: import os f_path = r'C:\Users\PycharmProjects\mystudy\Testfolder ...
- 写了个python脚本,循环执行某一个目录下的jmeter脚本————解决的问题,每次回归时,都得一个个拉取
import os import time #需要你改的就这3个参数 #path是放你jmx脚本的文件夹路径 path="D:\\桌面\\每次都是从共享上考最新的\\" #jtl_ ...
- grunt 一个目录下所有的js文件压缩 配置收藏
module.exports = function(grunt){ // 项目配置 grunt.initConfig({ pkg: grunt.file.readJSON('package.json' ...
- Javac命令一次编译一个目录下的所有java文件
将生成的class文件所部按package路径输出到classes目录当中: javac -d .\classes src\*.java
- 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本
摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 ...
- Python读取一个目录下的所有文件
#!/usr/bin/python # -*- coding:utf8 -*- import os allFileNum = 0 def printPath(level, path): global ...
- Python:遍历一个目录下所有的文件及文件夹,然后计算每个文件的字符和line的小程序
编写了一个遍历一个目录下所有的文件及文件夹,然后计算每个文件的字符和line的小程序,先把程序贴出来. #coding=utf-8 ''' Created on 2014年7月14日 @author: ...
- python 读取一个目录下的所有目录和文件
#!/usr/bin/python # -*- coding:utf8 -*- import os allFileNum = 0 def printPath(level, path): global ...
- python 删除一个目录下的所有文件
一个目录下有文件,文件夹,文件夹里又有文件.文件夹....用python脚本,实现,递归删除一个目录下的所有文件: 目录结构如下: 其中我们要删除所有文件 代码实现如下: import os CUR_ ...
随机推荐
- Linux 编译ACE
1.下载 从官网下载地址 http://download.dre.vanderbilt.edu/previous_versions/选择一个版本下载. 注意,如果是在linux上编译,需要下载.gz结 ...
- 虚幻4外包团队-推荐非常全面的的Unreal教程
<Unreal SDK 游戏开发从入门到精通(UnrealScript语法.UI Scene界面.UDK独立开发游戏)> 课程讲师:Shark 课程分类:.net 适合人群:初级 课时数 ...
- mac ssh localhost
转自:http://blog.csdn.net/cwj649956781/article/details/37913637 mac 无法ssh localhost,错误提示:bash: /usr/lo ...
- Spark BlockManager的通信及内存占用分析(源码阅读九)
之前阅读也有总结过Block的RPC服务是通过NettyBlockRpcServer提供打开,即下载Block文件的功能.然后在启动jbo的时候由Driver上的BlockManagerMaster对 ...
- CentOS下安装LAMP环境
1.安装Apache yum -y install httpd # 开机自启动 chkconfig httpd on # 启动httpd 服务 service httpd start #安装apach ...
- MVC表单
.cs namespace SendToMvcHello.Controllers { public class HomeController : Controller { // GET: Home p ...
- (2016 年) githup 博客地址 : https://github.com/JMWY/MyBlog
githup 博客地址 : https://github.com/JMWY/MyBlog
- BIOS设置之UEFI/Legacy BIOS切换图文详解
近几年出现的电脑其中相当一部分都配置了UEFI BIOS,不过大多都默认以Legacy BIOS方式启动.而Win8正式上市后, 所有预装Win8(或Win8.1)的电脑都配置了UEFI BIOS并且 ...
- Capture Current Soft Screen
Bitmap memoryImage; private void CaptureScreen() { Graphics myGraphics = this.CreateGraphics(); Size ...
- swiper
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...