ðâ€信息:本文假设您对Linux/Bash Shell和Python具有中间知识。
如果使用Windows操作系统,请查看有关如何设置WSL2的指南。否则这将行不通!
macOS用户,我很抱歉,有关SystemD的零件无关紧要,但是您可以按照Python代码进行关注。
什么是VENV?
python虚拟环境(VENV)是孤立的环境,您可以在其中安装软件包而不会影响其他项目。
这使您可以为不同的项目具有不同的包装版本,而无需它们彼此干扰。
简而言之,它将您的所有程序库捆绑在文件夹中。
为什么要从脚本使用它?
假设您正在构建API。如果您不使用容器或deterministic system,则可能需要避免使用系统python可能过时的软件包。
做到这一点的方法是使用requirements.txt
文件与VENV结合使用,它使您可以选择所需的包装的特定版本。
为了帮助将此API与系统集成在一起,您可能需要使用systemd service
文件。
如何 ?
首先,转到您的项目文件夹。我假设您的虚拟环境位于一个名为.venv
的文件夹中。
现在创建一个名为run.sh
的文件,并在您喜欢的文本编辑器中打开它:
export PATH="$(pwd)/.venv/bin:$PATH"
python main.py
这将激活venv
并运行main.py
脚本。
希望您发现此信息有用! ð
奖励:让我们创建一个简单的API并使SystemD启动它
我们将大量使用命令行,我想您为此做好了准备! ð
为您的项目制作文件夹:
mkdir simple-api
打开您喜欢的代码编辑器中的文件夹,然后从中启动terminal
。
让我们得到一个venv
python3 -m venv .venv
source .venv/bin/activate
添加flask
,我们将用来构建此api
的库
pip install flask
我们还将添加gunicorn
a的生产准备金
pip install gunicorn
创建一个Lockfile
pip freeze > requirements.txt
创建一个src
文件夹和您的初始main.py
文件
mkdir src
touch src/main.py
这就是文件夹结构的外观:
让我们开始编码:
from os import getenv
from flask import Flask, jsonify
from random import choice
app = Flask(__name__)
greetings = ["Hello", "Hola", "Bonjour", "Hallo", "こんにちは", "Hei", "Привіт"]
@app.route(f'/')
def index():
return jsonify({'msg': choice(greetings)})
if __name__ == '__main__':
app.run(host=getenv('HOST') or '127.0.0.1', port=getenv('PORT') or '5000')
现在,我将解释代码:
进口是不言自明的:
- 烧瓶以收听请求并回复它们
-
getenv
用于阅读环境变量(我们后来将用于港口和主机) -
choice
用于从我们的列表中选择随机问候
此行初始化库
app = Flask(__name__)
在这里,我们存储多种方式打招呼:
greetings = ["Hello", "Hola", "Bonjour", "Hallo", "こんにちは", "Hei", "Привіт"]
此代码说,嘿:以下功能是端点/
的GET
路线
@app.route(f'/')
def index():
在这里,我们首先从问候列表中选择一个随机项目,然后将其存储在字典中,最后将其返回为JSON
文本。
哇,只有一行代码!
return jsonify({'msg': choice(greetings)})
最后,我们运行API
,以便我们可以收听请求。
if语句检查我们是否直接运行脚本,使用gunicorn
等生产应用程序服务器是必需的。
下一行抓住环境变量并为其提供一些默认值。
然后我们启动我们的程序! ð
if __name__ == '__main__':
app.run(host=getenv('HOST') or '::', port=getenv('PORT') or '5000')
让我们测试它!
python main.py
让我们称之为!使用另一个终端
curl http://localhost:5000/
您应该看到这个:
{"msg":"Hello"}
- 它起作用!不错
让我们配置Systemd
为此,我将使用
systemd
用户服务,如果您的服务器/VPS
作为root运行,则可能需要考虑为您的项目创建用户。如果您想使用默认服务继续使用,只需从此处的所有命令中删除
--user
标志。
要使我们的程序自动从系统中自动启动,我们需要创建一个System-D单元。
但首先,让我们制作一个bash脚本以启动我们的API:
touch launch.sh
信息:我们正在SRC目录之外创建此文件。
export PATH="$(pwd)/.venv/bin:$PATH"
python -m gunicorn --chdir src main:app -w 4 --threads 2 -b [::]:5000
我将解释此脚本中会发生什么:
首先,我们设置了PATH
变量,因此我们可以从venv
运行python,然后执行Gunicorn模块,并将启动AppServer。
参数确保更改为src
目录,并在4
工人上运行2
线程。
它还告诉它通过在端口5000
[::]
绑定在所有地址上
您可以通过运行脚本进行测试。
在此之前,如果已经激活了VENV,则关闭现有终端
./launch.sh
完成测试后,请按Ctrl+C
(或Command+C
)
让我们设置服务单元:
mkdir -p ~/.config/systemd/user
cd ~/.config/systemd/user
touch simple-api.service
使用您的文本/代码编辑器打开文件simple-api.service
:
[Unit]
Description=My flask API
[Service]
WorkingDirectory=/home/user/simple-api
ExecStart=bash launch.sh
[Install]
WantedBy=default.target
您需要用项目路径替换
/home/user/simple-api
。
启用单元:
systemctl --user daemon-reload
systemctl --user enable --now simple-api.service
建议使用服务器/VPS(不是您的开发机):
sudo loginctl enable-linger $(whoami)
这将使您的所有用户服务都可以启动,即使您尚未登录。
让我们尝试称呼它!
curl http://localhost:5000/
{"msg":"Bonjour"}
希望您喜欢这篇文章!祝你有美好的一天! �ºPAR
恢复变化
重要如果您不希望此API永远使用port
5000
!
禁用服务单元:
systemctl disable --user simple-api.service
删除它:
rm ~/.config/systemd/user/simple-api.service
删除simple-api
文件夹。