如何使用bash脚本使用Python Venv
#python #api #bash

ðâ€信息:本文假设您对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

这就是文件夹结构的外观:

Folder structure

让我们开始编码:

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文件夹。