使用Python启动一个HttpServer

  |   0 评论   |   1,106 浏览

背景:

在服务上进行运维的时候,很多时候要进行文件拷贝.但是由于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服务器

将模块当做脚本去启动有什么用?

  1. python xxx.py
  2. 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解析器会在这些目录下去寻找依赖库。

参考


  1. https://www.cnblogs.com/huanglinxin/p/9455559.html
  2. https://www.letianbiji.com/python/python-simplehttpserver.html

评论

发表评论


取消