打包
目前了解下来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
是一样。
特地借用python标准库中http包,写了一个简单的http服务器,这样就能保持服务一直拉起状态,方便测试。
import http.server
import http
class request_handle(http.server.SimpleHTTPRequestHandler):
"""
自定义请求处理类
"""
def do_GET(self):
print('client_address', self.client_address)
print('headers', self.headers)
print('path', self.path)
print("command:", self.command)
self.send_response(200)
self.wfile.write("i get your message by get".encode("utf-8"))
def do_POST(self):
print('client_address', self.client_address)
print('headers', self.headers)
print('path', self.path)
print("command:", self.command)
self.send_response(200)
self.wfile.write("i get your message by post".encode("utf-8"))
def my_server():
addr = "127.0.0.1"
port = 8080
server_o = (addr, port)
httpd = http.server.HTTPServer(server_o, request_handle)
return httpd
def info():
print('http...')
if __name__ == '__main__':
info()
my_server().serve_forever()
通过命令curl http:/127.0.0.1:8080/test/ok
测试。
部署
另外像docker一样部署,也完全是与java一致,或者说docker部署可编程语言是解耦的,docker 的 cmd []
命令只要拉起程序就行。
FROM python:3.9
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
CMD ["python","app.py"]
docker 部署启动,构建image起本质与服务器上直接python启动是相同的,只是对加了一个沙盒。
工程目录直接zip,然后在服务器上unzip,用python命令启动也挺快。有时候一个单文件的脚本.py的移动并可执行,真的是很方便。确实在这块来说,比java吸引人,特别是哪些只是作为一个脚本用的人来说。
学海无涯,苦作舟