Python 高级 10. 终端启动python程序获取命令行参数使用sys.argv、web静态服务器

1.sys.argv

import sys

导入sys模块

params = sys.argv

终端启动python程序获取命令行参数使用sys.argv,返回一个参数列表,第一个参数是.py文件名,第二个参数是传入的参数

2.web静态服务器

<1>目标

  知道固定数据响应报文的封装

  知道读取固定网页数据封装响应报文数据

  知道获取请求资源路径的方式,返回指定页面数据

  知道判断请求资源找不到的处理操作

  知道如何实现多任务web服务器

  知道面向对象的方式开发web服务器

  知道启动程序获取命令行参数

<2>代码

import socket

import re

import gevent

from gevent import monkey

import sys

# 让gevent能够识别耗时操作,让协程自动切换执行,失败的耗时操作由: recv, accept, time.sleep, 网络请求延时

monkey.patch_all()

# 封装的web服务器类

class HttpWebServer(object):

    def __init__(self, port):

        # 创建tcp服务端套接字

        tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 设置socket选项,立即释放端口

        tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

        # 绑定端口号

        tcp_server_socket.bind(("", port))

        # 设置监听

        tcp_server_socket.listen(128)

        # 创建对象提供socket属性

        self.tcp_server_socket = tcp_server_socket

    # 启动服务器

    def start(self):

        # 循环接收客户端的连接请求

        while True:

            service_client_socket, ip_port = self.tcp_server_socket.accept()

            # handle_client_request(service_client_socket)

            # 开辟协程并执行对应的任务

            gevent.spawn(self.handle_client_request, service_client_socket)

            # 不需要加上join,主要原有是我们的进程不会退出

            # g1.join()

    # 处理客户端的请求

    @staticmethod

    def handle_client_request(service_client_socket):

        # 获取客户端的请求报文数据

        client_request_data = service_client_socket.recv(4096)

        print(client_request_data)

        # GET /index2.html HTTP/1.1xxxxxxx

        client_request_conent = client_request_data.decode("utf-8")

        # 通过正则查找请求的资源路径

        match_obj = re.search("/\S*", client_request_conent)

        if not match_obj:

            print("访问路径有误")

            service_client_socket.close()

            return

        # 获取匹配结果

        request_path = match_obj.group()

        print(request_path)

        if request_path == "/":

            # 如果用户没有指定资源路径那么默认访问的数据是首页的数据

            request_path = "/index.html"

        # 读取指定文件数据

        # 使用rb的原因是浏览器也有可能请求的是图片

        try:

            with open("static" + request_path, "rb") as file:

                # 读取文件数据

                file_data = file.read()

        except Exception as e:

            # 准备响应报文数据

            # 响应行

            response_line = "HTTP/1.1 404 Not Found\r\n"

            # 响应头

            response_header = "Server: PWS1.0\r\nContent-Type: text/html;charset=utf-8\r\n"

            # 响应体 -> 打开一个404html数据把数据给浏览器

            response_body = "<h1>非常抱歉,您当前访问的网页已经不存在了</h1>".encode("utf-8")

            # 匹配响应报文数据

            response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body

            # 发送响应报文数据

            service_client_socket.send(response_data)

        else:

            # 准备响应报文数据

            # 响应行

            response_line = "HTTP/1.1 200 OK\r\n"

            # 响应头

            response_header = "Server: PWS1.0\r\nContent-Type: text/html;charset=utf-8\r\n"

            # 响应体

            response_body = file_data

            # 匹配响应报文数据

            response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body

            # 发送响应报文数据

            service_client_socket.send(response_data)

        finally:

            service_client_socket.close()

# 主函数

def main():

    print(sys.argv)

    if len(sys.argv) != 2:

        print("启动命令如下: python3 xxx.py 9090")

        return

    if not sys.argv[1].isdigit():

        print("启动命令如下: python3 xxx.py 9090")

        return

    port = int(sys.argv[1])

    print(port)

    server = HttpWebServer(port)

    server.start()

if __name__ == '__main__':

    main()

小结

终端启动python程序获取命令行参数使用sys.argv

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,200评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,526评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,321评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,601评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,446评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,345评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,753评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,405评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,712评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,743评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,529评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,369评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,770评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,026评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,301评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,732评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,927评论 2 336

推荐阅读更多精彩内容