解决方案:打开任务管理器,在进程中找到Python进程,结束(笨方法,且只适用于单进程运行方式下使用)
PS:什么叫非正常结束,就是不是通过结束按钮停止程序,程序出错而停止的情况下,再次运行程序就可能出现端口未被释放的情况
解决方案:使用tornado.options 可以帮我们不把端口写死,将端口值以参数的形式传入,当程序运行时,再告诉程序使用什么端口值
tornado.options的作用:全局参数的定义、存储和转换
原方式:httpServer.bind(8888)
后方式:httpServer.bind(prot) #定义一个变量
port的值需要从外部获取,程序内部需要接受存储 #存储
将接收的值转换为其中的某一个值
一、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)
注解:全局的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传参若字符中有空格,之后的字符则不传入