Python中如何将代码封装为系统服务并提供外部调用接口

搜索了下还是不怎么清楚 比如一段计算器代码,传递参数得到计算结果 我安装为系统服务 这样其他语言也可以使用


Python中如何将代码封装为系统服务并提供外部调用接口
9 回复

你把这个封装成一个 module 里面去,然后放到系统 default 的 python 的 package 里面调用就行了


这个问题可以拆成两部分:把Python代码做成系统服务,以及给它一个外部调用的接口。

1. 把代码做成系统服务

在Linux上,最标准的方式是用systemd。你需要创建一个.service文件,比如叫my_python_app.service,放在/etc/systemd/system/下面。文件内容大概长这样:

[Unit]
Description=My Python Application
After=network.target

[Service]
Type=simple
User=your_username
WorkingDirectory=/path/to/your/app
ExecStart=/usr/bin/python3 /path/to/your/app/main.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

然后跑sudo systemctl daemon-reload加载配置,用sudo systemctl start my_python_app启动,sudo systemctl enable my_python_app设置开机自启。在Windows上,可以用NSSM(Non-Sucking Service Manager)这个工具,图形界面操作几下就能搞定。

2. 提供外部调用接口

这就看你具体需求了。简单点,在代码里起个HTTP服务器,用FlaskFastAPI框架写几个API端点。比如用FastAPI:

from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.post("/do_something")
def do_something():
    # 这里是你的核心业务逻辑
    result = your_core_function()
    return {"result": result}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

这样你的服务启动后,别人就能通过http://你的服务器IP:8000/do_something来调用功能了。如果调用更复杂,或者需要跨语言,可以考虑用gRPC。

总结一下:用systemd/NSSM托管进程,用Web框架(如FastAPI)暴露HTTP API是最常见、最实用的组合拳。

核心就两步:守护进程化 + 网络接口暴露。

简单点就是 RESTful,做成一个 HTTP 服务

搜索关键词:进程间通信
常见的:管道,信号量,消息队列,共享内存,套接字等

或者如 2#所说,给他做成一个 http 服务

ZeroMQ

http://zeromq.org/

 Ø   Connect your code in any language, on any platform.
 Ø   Carries messages across inproc, IPC, TCP, TIPC, multicast.
 Ø   Smart patterns like pub-sub, push-pull, and router-dealer.

系统服务?你这是打算用啥系统啊? Windows 下倒是有 COM 接口,不过没有看到过用 Python 写 COM 服务的,不知道行不行。我觉得#3 楼的方案比较靠谱。此外,还可以使用类似 Pyro 这种通过网络调用的服务。

听起来远程调用可以做到

http://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/chapter5/11_A_remote_procedure_call_with_RPyC.html

大部分语言都支持,不过我不了解能不能跨语言。

意思是 systemctl start yourservice.service 来启动一个 daemon ?可以参考 shadowsocks 啊,不行就写 socket 老老实实进程间通信好了

感觉做成 RPC 服务可以实现。
可以用现有成熟的 REST/Grpc/Thrift,或者自己写协议(一般没什么必要)

回到顶部