WEB开发网
开发学院软件开发Python 用 Python 编写插件 阅读

用 Python 编写插件

 2010-09-22 11:14:14 来源:WEB开发网   
核心提示: 注意:本文提供了 pathtool 的 源代码,这个示例的关键点是使用 lambda,用 Python 编写插件(2),在 参考资料 中可以找到关于 lambda 的 Python 教程,但是简单地说,lambda 是让一个函数 “调用” 另一个函数的简便方法, 编

注意:本文提供了 pathtool 的 源代码。这个示例的关键点是使用 lambda。在 参考资料 中可以找到关于 lambda 的 Python 教程,但是简单地说,lambda 是让一个函数 “调用” 另一个函数的简便方法。

编写一个可插入的命令行工具

我们已经基本了解了如何使用这个包含回调函数的路径操作库,现在要编写一个可以用插件扩展的命令行工具。先看一下完成后的版本,然后分析其组成部分:

清单 2. 带插件的命令行工具

#!/usr/bin/env python
# encoding: utf-8
"""
pathtool-cli.py 0.1
A commandline tool for walking a filesystem.
Takes Action callback plugins in a plugin directory
action=(lambda rec: print_rec(rec))
"""
from pathtool import path
import optparse
import re
import os
import sys
try:
  plugin_available = True
  from plugin import *
  from plugin import __all__ #note this is the registered plugin list
except ImportError:
  plugin_available = False
    
def path_controller():
  descriptionMessage = """
  A command line tool for walking a filesystem.
  Takes callback 'Action' functions as plugins.
  
  example: pathtool_cli /tmp print_path_ext
  """
  p = optparse.OptionParser(description=descriptionMessage,
                prog='pathtool',
                version='pathtool 0.1.1',
                usage= '%prog [starting directory][action]')
  p.add_option('--pattern', '-p',
        help='Pattern Match Examples: *.txt, *.iso, music[0-5].mp3
        plain number defaults to * or match all. 
        Uses UNIX standard wildcard syntax.',
        default='*')
  p.add_option('--list', '-l',
      action="store_true",
      help='lists available action plugins',
      default=False)
          
  options, arguments = p.parse_args()
  if options.list:
    try:
      print "Action Plugins Available:"
      if plugin_available:
        for p in __all__:
          print p
    finally:
      sys.exit(0)
      
  if len(arguments) == 2:
    fullpath = arguments[0]
    try:
      action_plugin = eval(arguments[1]) 
      #note we expect the plugin author to write a method with our naming convention
      #path(fullpath,options.pattern,action=(lambda rec: move_to_tmp.plugin(rec)))
      path(fullpath, options.pattern,action=(lambda rec: action_plugin.plugin(rec)))
    except NameError:
      sys.stderr.write("Plugin Not Found")
      sys.exit(1)
  else:
    print p.print_help()
def main():
  path_controller()
if __name__ == '__main__':
  main()
   

上一页  1 2 3 4 5  下一页

Tags:Python 编写 插件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接