Tornado初学篇(五) Tornado.options模块 命令行传参

命令行传参方式不怎么使用,一般使用配置文件传参

 

问题一:当程序是非正常结束时,就可能出现OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

Tornado初学篇(五) Tornado.options模块 命令行传参_第1张图片

解决方案:打开任务管理器,在进程中找到Python进程,结束(笨方法,且只适用于单进程运行方式下使用

PS:什么叫非正常结束,就是不是通过结束按钮停止程序,程序出错而停止的情况下,再次运行程序就可能出现端口未被释放的情况

 问题二:每次端口都是固定写死的,这就导致我们在每次程序运行出错时就需要更改端口,比较麻烦

解决方案:使用tornado.options 可以帮我们不把端口写死,将端口值以参数的形式传入,当程序运行时,再告诉程序使用什么端口值

tornado.options的作用:全局参数的定义、存储和转换

原方式:httpServer.bind(8888)

后方式:httpServer.bind(prot)  #定义一个变量

port的值需要从外部获取,程序内部需要接受存储  #存储

将接收的值转换为其中的某一个值

 

 

tornado.options的基础方法和属性的使用

一、tornado.options.define()     #有括号的代表方法

注解:什么叫函数的原型、函数的功能、函数的参数

原型:指函数具体长啥模样,功能:指有什么功能,参数:括号中有什么参数可以使用

原型:

tornado.options.define(name, default=None, type=None, help=None, metavar=None, multiple=False, group=None,
                       callback=None)

功能:用来定义options选项变量的方法 可以用来定义端口值

参数:

    1.name    选项变量名,必须保证name的唯一性,否则会报options中的某个参数早已定义

tornado.options.define("port", default=None, type=None, help=None, metavar=None, multiple=False, group=None,
                       callback=None)

ps:在代码中我使用的是port,所以定义时把name改为“port”,不是非要使用“port”,根据自己方式进行填写

    2.default  默认值,默认为None,设置了则为设置的值

tornado.options.define("port", default=8888, type=None, help=None, metavar=None, multiple=False, group=None,
                       callback=None)

   3.type   设置变量的类型 若使用8000,则type=int  ,在选项中8000以整型方式使用

               从命令行或配置文件中导入参数是tornado会根据输入值的类型进行转换,转换不了的数据类型会报错,

              支持的数据类型有:str,float,int,datetime,timedelta          timedelta本人至今未用过

             若没有设置type,则根据default的值进行转换,如果没有设置default,type就不进行转换

tornado.options.define("port", default=8888, type=int, help=None, metavar=None, multiple=False, group=None,
                       callback=None)

一般使用前三个参数

示例

# 定义一个默认值为8888,类型为整型
tornado.options.define('port', default=8888, type=int)
# 接收一个列表,类型为字符串
tornado.options.define('list', default=[], type=str)

 

    4.multiple  设置变量是否可以为多个值,默认为False

   5.help  变量的帮助提示信息(比如代码过了八天忘了port代表什么意思)

tornado.options.define("port", default=8888, type=int, help="This is a port number", metavar=None, multiple=False, group=None,
                       callback=None)

 

tornado.options.options

注解:全局的options对象,所有的选项变量都会作为该对象的属性

在以上的代码中我们定义了tornado.options的方法
tornado.options.define('port', default=8888, type=int)
tornado.options.define('list', default=[], type=str)

那我们就可以在tornado.options.options后使用点语法可以得到port

eg:tornado.options.options.port     同样也可以得到.list

使用位置:

eg:httpServer.bind( tornado.options.options.port)

问题三、我们定义了两个参数可以传参,所以需要一个函数来转换命令行参数

解决方案:tornado.options.parse_command_line()

使用位置:在实例化Application之前使用tornado.options.parse_command_line(),括号内无需填写任何参数,就能转换命令行参数

import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options

# 定义一个默认值为8888,类型为整型
tornado.options.define('port', default=8888, type=int)
# 接收一个列表,类型为字符串
tornado.options.define('list', default=[], type=str, multiple=True)


class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('fuck off 灭霸!')


if __name__ == '__main__':
    # 用于转换命令行的参数
    tornado.options.parse_command_line()
    # 由于我们定义了一个列表变量
    print("list = ", tornado.options.options.list)
    # 打印从命令行获取的端口号
    print("port= ", tornado.options.options.port)
    app = tornado.web.Application(
        [
            (r'/', IndexHandler)
        ]
    )
    httpServer = tornado.httpserver.HTTPServer(app)
    # 获取命令传的值
    httpServer.bind(tornado.options.options.port)
    # 开启进程
    httpServer.start(1)
    tornado.ioloop.IOLoop.current().start()

重点来了,敲黑板!!!在黑屏终端使用命令行的方法:

1.先找到文件所在的目录

2.使用python server.py --port=8002 --list=milk,goods,fuck off

注解:-- 是减号不是下划线     --port=8002 指定端口号为8002,而不是使用默认的8888端口

每个命令之后都有空格隔开,最后的不用,list传参若字符中有空格,之后的字符则不传入

Tornado初学篇(五) Tornado.options模块 命令行传参_第2张图片

 

你可能感兴趣的:(Tornado)