使用Python启动一个HttpServer
背景:
在服务上进行运维的时候,很多时候要进行文件拷贝.但是由于dokcer容器的限制. 很多时候无法使用基本的如 scp 命令进行文件拷贝. 这个时候就可以使用命令行进行简单的HTTPServer开放HTTP端口供下载.
Python2 HTTP Server
简单命令如下:
# 以命令执行路径为 共享目录``python -m SimpleHttpServer 8000 |
---|
以上命令可以运行.但是不能后台. shell断开后.或者网络断了后. 服务就会中断. 简单优化是:
python -m SimpleHttpServer 8000 & |
---|
在上述命令的最后加了一个 & . 则命令产生的进程会在后台运行,不会影响当前(终端)用户使用. 生成的新的进程是当前bash的子进程. 所以在我们在关闭当前Bash的时候,相应的子进程也会被Kill掉.
进一步优化:
nohup python -m SimpleHttpServer 8000 & |
---|
在命令的开头加一个 nohup. 忽略掉所有的挂断信号,如果当前 bash关闭,则当前进程会挂载到init进程下,成为其子进程,这样即使退出当前用户,其8000端口也可以使用.
Python3 HTTP Server
在python3 中模块的名字发生了变化.变为了: http.server 基本的命令也变为了:
python3 -m http.server 8000 |
---|
如果要指定绑定的IP,则使用 --bind 参数 :
# 这样只能在本地才能访问到此端口``python3 -m http.server 8000 --bind 127.0.01 |
---|
同样的, 更完整的可后台运行的命令是:
nohup python3 -m http.server 8000 & |
---|
关于 python的 -m 参数
先看看 python --help 给出的信息:
run library module as a script (terminates option list)
常用的例子如下:
python -m SimpleHTTPServer #python2中启动一个简单的http服务器
python -m http.server #python3中启动一个简单的http服务器
将模块当做脚本去启动有什么用?
- python xxx.py
- python -m xxx.py
这是两种加载py文件的方式:
1叫做直接运行
2 相当于import,叫做当做模块来启动
不同的加载py文件的方式,主要是影响sys.path这个属性。sys.path相当于Linux中的PATH
python3
Python 3.8.10 (default, Nov 14 2022, 12:59:47)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']
>>>
这就是当前Python解析器运行的环境,Python解析器会在这些目录下去寻找依赖库。