python:FTP之参数解析与命令分发

首先说参数解析,需要涉及optparse模块知识;

 首先你必须导入该类,并创建一个OptionParser对象,然后再使用parser.add_option(...)来定义命令行参数,及其帮助文档。

 每个命令行参数就是由参数名字符串和参数属性组成的;

基本格式:

op.add_option("-s","--server",dest="server")

当你将所有的命令行参数都定义好了的时候,我们需要调用parse_args()方法来解析add_option()函数依次传入的参数:

options,args = parser.parser_args()

options 是一个打印出来呈现是字典,但本质它是一个对象,其key字典中的关键字可能会是是我们所有的add_option()函数中的dest参数值,其对应的value值,是命令行输入的对应的add_option()函数的参数值;

……

命令分发

使用hasattr(),来确认输入命令是否是实例有的属性,若是true就启动命令对应的函数

 if hasattr(self,cmd):
            func=getattr(self,cmd)
            func()

下面主要说一下FTP的命令执行的整体结构:

bin--ftp_server.py里的代码:

#-*-conding:utf-8 -*-
import os,sys

DIRNAME=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(DIRNAME)

from core import main


if __name__ == '__main__':
    '''
    启动core目录下的main文件里的ArgvHandler类
    '''
    main.ArgvHandler()

core--main.py里面的代码:

#-*-coding:utf-8 -*-

import os,sys
import optparse
import socketserver

DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(DIR)

from conf import settings
from core import server

class ArgvHandler():

    def __init__(self):
        #首先你必须导入该类,并创建一个OptionParser对象,然后再使用parser.add_option(...)
        #来定义命令行参数
        self.op=optparse.OptionParser()

        '''
        这里定义命令行参数,之所以将其注释掉,是因为,服务配置的参数一般放在conf配置文件中的settings中
        self.op.add_option("-s","--server",dest="server")
        self.op.add_option("-P","--port",dest="port")
         
         '''

        #下面这一句,使用parse_args(),来解析传入的参数
        options,args=self.op.parse_args()

        # print(options)
        # print(args)
        self.verify_args(options,args)

    def verify_args(self,options,args):
        '''命令分发'''
        #根据上面参数解析的代码,args中的第一个肯定是cmd命令
        cmd=args[0]
        #判断服务端是否有该命令匹配的属性功能,有则调用函数,执行功能
        if hasattr(self,cmd):
            func=getattr(self,cmd)
            func()

    def start(self):
        '''start方法,简单举例,若服务端接收的信息中解析到start参数,就会根据命令分发,启动该函数'''
        print("the server is working")
        s= socketserver.ThreadingTCPServer((settings.IP,settings.PORT),server.ServerHandler)
#server.ServerHandler类在core.server文件中,主要的功能就在那个文件夹,而这里所有的代码,就是为了实现参数解析、命令分发
        s.serve_forever()

    def help(self):

        pass

core--server文件中的代码(简单举例):

#-*-coding:utf-8 -*-

import socketserver



class ServerHandler(socketserver.BaseRequestHandler):

    '''
    该类主要供是core--main文件中调用
    '''
    def handle(self):
        #所有的功能都写在handle函数中……
        print("ok")



猜你喜欢

转载自blog.csdn.net/ak739105231/article/details/88377035