首先说参数解析,需要涉及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")