python进阶打包部署docker

Owen Jia 2022年12月21日 773次浏览

打包

目前了解下来python是没有打包构建可执行文件,类似java的flat jar概念的。我想这正和‘解释型语言’与‘编译型语言’的区别,.java文件先要编译.class文件才能执行,而.py直接即能执行。

所以在python的部署里,只要把工程文件全部copy或者zip下放到服务器上,再把python环境在服务器上安装好即可,对于有venv环境的,三方包已经在venv的site-packages下,所以理论上copy过去就能直接python app.py这般执行。

也支持类似nohup命令 nohup /bin/python3 app.py>/dev/null 2>&1 &是可行的,这个java -jar app.jar是一样。

http-server-docker

http-server-docker

特地借用python标准库中http包,写了一个简单的http服务器,这样就能保持服务一直拉起状态,方便测试。

  1. import http.server
  2. import http


  3. class request_handle(http.server.SimpleHTTPRequestHandler):
  4. """
  5. 自定义请求处理类
  6. """
  7. def do_GET(self):
  8. print('client_address', self.client_address)
  9. print('headers', self.headers)
  10. print('path', self.path)
  11. print("command:", self.command)

  12. self.send_response(200)
  13. self.wfile.write("i get your message by get".encode("utf-8"))

  14. def do_POST(self):
  15. print('client_address', self.client_address)
  16. print('headers', self.headers)
  17. print('path', self.path)
  18. print("command:", self.command)

  19. self.send_response(200)
  20. self.wfile.write("i get your message by post".encode("utf-8"))


  21. def my_server():
  22. addr = "127.0.0.1"
  23. port = 8080
  24. server_o = (addr, port)
  25. httpd = http.server.HTTPServer(server_o, request_handle)
  26. return httpd


  27. def info():
  28. print('http...')


  29. if __name__ == '__main__':
  30. info()
  31. my_server().serve_forever()

通过命令curl http:/127.0.0.1:8080/test/ok测试。

部署

另外像docker一样部署,也完全是与java一致,或者说docker部署可编程语言是解耦的,docker 的 cmd []命令只要拉起程序就行。

  1. FROM python:3.9
  2. WORKDIR /app
  3. ADD . /app
  4. RUN pip install -r requirements.txt
  5. CMD ["python","app.py"]

docker 部署启动,构建image起本质与服务器上直接python启动是相同的,只是对加了一个沙盒。

工程目录直接zip,然后在服务器上unzip,用python命令启动也挺快。有时候一个单文件的脚本.py的移动并可执行,真的是很方便。确实在这块来说,比java吸引人,特别是哪些只是作为一个脚本用的人来说。

学海无涯,苦作舟