前言

存在许多独立的python脚本,这些脚本可能会增加,也可能会减少,现在需要按照某种顺序调度这些程序。在python的standard library中,有一个模块imp可以实现动态的调用pthon脚本,实现调用,imp需要知道脚本的module name,module path。

思路

(一) 所有的python脚本都要提供一个入口函数:

  1. def main(args):#argsstring,由脚本编写者自行解析
  2. return exit_code #-1失败,其他成功
  1.  

args是脚本运行需要的参数,参数为字符串,格式有脚本编写者自行设定,自行解析。

(二) 建立2个表:script_list、script_log。

1. script_list用来记录需要执行的脚本的信息。主要字段有:module_name,module_path,module_args。其中module_name,module_path是为模块imp准备的,module_args是为函数main准备的。

2. script_log用来记录脚本执行情况的日志。

(三)执行

1. 根据module_name,module_path调用脚本。

2. 然后执行脚本的main函数,并把module_args传给main函数

3. 将执行的结果记录日志(这一步可以根据实际情况编写)

实现

表的实现可以由多种方式。可以通过数据库,也可以仅仅是一个配置文件,这个可以根据实际情况编写。所以主要关注如何实现python脚本的调度。

代码如下:

  1. import sys,imp,os,traceback
  2.  
  3. def load(module_name,module_path):
  4. '''使用imp的两个函数find_module,load_module来实现动态调用Python脚本。
  5. 如果发现异常,需要解除对文件的占用
  6. '''
  7. fp, pathname, description=imp.find_module(module_name,[module_path])
  8. try:
  9. return imp.load_module(module_name,fp,pathname,description)
  10. finally:
  11. if fp:
  12. fp.close()
  13.  
  14. def do(module_name,module_path,module_args):
  15. '''在这个过程中用到3个模块,其做用分别是:
  16. sys:添加library的path,因为有的脚本会调用其他的脚本,如果没有将脚本的路径添加到path,会调用失败。
  17. os:设置当前的工作目录为脚本的目录
  18. traceback:如果脚本异常,获取异常信息
  19. '''
  20. #设置环境
  21. sys.path.append(module_path)
  22. default_cwd=os.getcwd()
  23. os.chdir(module_path)
  24. #调用与执行
  25. try:
  26. do=load(module_name,module_path)
  27. exit_code=do.main(module_args)
  28. if exit_code==-1:
  29. print('execute error')#可以修改
  30. except:
  31. vtype,value,trace=sys.exc_info()
  32. error_string=traceback.format_exception(vtype,value,trace)
  33. print(error_string)#可以修改,用于记录异常信息
  34. #还原环境
  35. sys.path.pop()
  36. os.chdir(default_cwd)

代码要点:

注意设置脚本的当前工作目录

总结

这仅仅是一个很简单执行其他脚本的功能,如果要实现一个脚本的调度系统会比较复杂,因为需要考虑脚本与脚本之间有依赖关系,脚本的执行有触发条件等,这就需要根据实际情况来定了。

动态执行python脚本的更多相关文章

  1. 使用sae定时执行Python脚本

    使用sae定时执行Python脚本 使用sae定时执行Python脚本 12,May,2014 | 57 Views 毕设压力略大,必须是桂林游的锅.去之前放松了几天,回来又休闲了几天,加上桂林的一周 ...

  2. mac上使用crontab周期性执行python脚本

    这个月买了本书<Linux系统命令及Shell脚本实践指南>, 看到了一个周期性执行任务cron.顿时产生一个想法: mac上有这种机制么? 加上自己也在15年下半年也学了点python脚 ...

  3. linux下设置计划任务执行python脚本

    linux下设置计划任务执行python脚本 简介 crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自 ...

  4. 怎样在windows上定时执行python脚本

    作为一个需要在电脑上工作和学习的人,一件十分困扰我的事情就是怎样不受互联网中其他内容的干扰而专注于自己想要做的事情,有的时候真的是沉浸于微博上的消息,忘了自己本来想要做的事.不过我有一件神器,自己爱豆 ...

  5. inotify+rsync实现实时同步(附解决crontab中无法执行python脚本的问题)

    1.准备环境 # 系统支持的话,下面的目录就会存在 ls /proc/sys/fs/inotify/ rpm -qa inotify-tools yum -y install inotify-tool ...

  6. Windows 任务调度程序定时执行Python脚本

    Windows 任务调度程序(Task Scheduler)可以定时执行程序,本文分享使用Task Scheduler定时执行Python脚本的两种方法. 在控制面版->管理员工具中打开 Tas ...

  7. windows 10 如何设定计划任务自动执行 python 脚本?

    我用 python 写了一些脚本,有一些是爬虫脚本,比如爬取知乎特定话题的热门问题,有一些是定期的统计分析脚本,输出统计结果到文档中.之前我都是手动执行这些脚本,现在我希望如何这些脚本能自动定时执行. ...

  8. jmeter 执行python脚本的方法 。(亲测ok)

    jmeter 执行python脚本   jmeter 可以通过Jython 执:行python代码 1.下载Jython jar包:http://www.jython.org/downloads.ht ...

  9. shell脚本中执行python脚本并接收其返回值的例子

    1.在shell脚本执行python脚本时,需要通过python脚本的返回值来判断后面程序要执行的命令 例:有两个py程序  hello.py 复制代码代码如下: def main():    pri ...

随机推荐

  1. Dump中查看dictionary信息的方法

    In order to dump the contents of a dictionary, you need to start with either the MethodTable or the ...

  2. Promiscuous Mode

      简介 Monitor mode 与 promiscuous mode 比较 这是在网卡上的的两个特殊的模式,简而言之,都是将网卡的过滤器关闭. Monitor mode 这是我们常常提到的snif ...

  3. 【JavaScript】【CSS】前端规则摘抄

    源:http://zhibimo.com

  4. 前台checkbox复选框提交到后台处理

    前台 <input type="hidden" id="tempString" name="tempString" /> < ...

  5. python day1:初识Python(一)

    一.Python 简介: Python免费.开源,面向对象的解释型语言,其语法简洁,在使用中无需考虑如何管理内存等底层问题,并且支持在linux,windows等多平台运行,Python的标准库很强大 ...

  6. hdu2586 LCA

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. Jsoup 使用教程:输入

    使用背景: 使用网络爬虫(或者手动复制),从别的网站上下载下来的内容,都是一堆的html,很多标签.样式 等等都可能是你所不需要的,或者 想要变成你想要的样式.那么该怎么办呢? 我们知道,每一个网页都 ...

  8. 通过CAGradientLayer制作渐变色效果(转)

    转载自:http://blog.it985.com/7986.html 看了极客学院的视频之后写的一篇博客,觉得不错,还是作为笔记使用. 简单介绍一下CAGradientLayer吧. Gradien ...

  9. input-placeholder

    :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #f00; } ::-moz-placeholder { /* Mozilla Fir ...

  10. <<< ajax在jsp中对于https跨域不能访问

    XMLHttpRequest cannot load https://www.emaple.com. No 'Access-Control-Allow-Origin' header is presen ...