【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Ubuntu】【远程开发】拉出内网 Web 服务:构建静态网页(一)
介绍了如何用 Sphinx 生成网页 HTML,并介绍了如何将网页从内网拉出来进行访问,下面继续
拉出内网 Web 服务
下面再分析下 python3 -m http.server 2025 这个命令,该命令通过使用 Python 内置模块,可以快速启动一个简易 HTTP 服务器,下面来逐项分析
-
python3:调用 Python3 解释器,本质上也是个二进制命令

-
-m:运行一个 Python 模块作为脚本,等会儿详细讲下 -
http.server:Python 标准库中的模块 ,可以提供基本的HTTP服务器功能 -
2025:指定服务器监听的端口号为2025
OK,再详细讲下 -m 选项,在终端输入
bash
man python3
可以找到 -m 选项的描述如下

有几个点说下:
- 首先,Python 会在
sys.path中查找指定的模块名,比如这里是http.server,sys.path是一个包含多个目录路径的列表,这个列表包括当前工作目录,标准库目录(比如/usr/lib/python3.x/),第三方包安装目录(比如site-packages),环境变量PYTHONPATH中的路径,所以-m http.server实际上是在这些地方找http/server.py,在终端输入
bash
find /usr/lib/python3* -name "server.py" -path "*/http/*"
可以看到,其路径如下

- 找到对应模块后,Python 会像运行普通脚本一样执行这个模块 ,但有一个关键区别:Python 会把该模块所在目录加入
sys.path,此时模块的 name 会被设置为 main ,此时和直接运行.py文件的效果一样,这样模块内部就可以写if __name__ == '__main__':来定义该模块作为脚本运行时的行为 ,比如http.server里就有这样的实现,所以可以直接启动服务器

- 从
-m module_name开始,后面的所有命令行参数都不再被 Python 解释器当作选项,而是全部传递给这个模块本身 ,也就是说,-m将是 Python 解释器的最后一个选项 ,之后的内容都是给模块用的 命令行参数,作为sys.argv[1:]传给该模块
OK,-m 选项分析完了,接下来再分析下这里的参数 2025,这里命令上虽然没有说明,但是从 server.py 源码里可以看出来,2025 指的就是端口 port

可以看到
port:这个参数没有-前缀,表示这是一个位置参数nargs='?':表示这个参数是可选的,可以没有,也可以有default=8000:如果没有这个参数,就默认用8000(一般是本地开发,测试 Web 服务时的默认端口之一 ),因为8000接近80(HTTP 默认端口 ),容易记忆,所以本地开发版网站一般在端口8000调试完成后,再升级到端口80作为正式网站type=int:会自动把输入转成整数
这里再解释下位置参数 和选项参数的区别
- 位置参数 :无前缀,不带
-或者--,顺序很重要 ,比如port这个参数在解析顺序里是第一个位置参数,那么server.py收到的第一个不带选项的参数,就是这个port参数,但其实port也是最后一个位置参数,相当于是唯一的位置参数 - 选项参数 :带前缀
-(短选项)或者--(长选项),对顺序来说不重要,比如上面的-d,-p
所以这里出现的第一个参数 2025,不带选项,而 server.py 里面有且仅有一个位置参数,那当然就是 port 端口参数了
OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【远程开发】拉出内网 Web 服务:后台运行(一)