ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir)

这篇具有很好参考价值的文章主要介绍了ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考文章

Python虚拟环境使用教程(以虚拟环境管理工具venv为例)(virtualenv、venv、pyenv、virtualenvwrapper、conda不同管理工具对比)

目录结构

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

步骤

安装venv

它会基于当前版本的python3来安装python3-venv

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

apt update && apt install python3.8-venv

查看python版本

执行python

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

创建虚拟环境

进入项目目录,执行:

python3 -m venv .venv-python3.8

(我把每个项目虚拟环境固定取名为.venv-python3.8,后续方便脚本操作)

20230813:改了,不这么搞了,容易混淆,每个虚拟环境都应该有自己特定的名字:

python3 -m venv .venv-python3.8-ky_ai_ip_change

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

可以看到,生成了目录.venv-python3.8

我这刚生成的虚拟环境占空间也不大,才7兆多:

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

激活虚拟环境

source .venv-python3.8/bin/activate

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

运行我们程序看缺少哪些依赖库,依次安装它们(禁用缓存下载–no-cache-dir)

执行:

python3 ip_change

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

发现少了ping3,装上:

pip install ping3

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

反复执行:

python3 ip_change

缺少啥库就装啥库:

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

下载太慢,我换成清华源,怎么还给我卡住了?

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent

20230813:如果有requirements.txt文件,可以直接:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

可以禁用缓存,因为缓存可能会导致大问题(比如缓存里有但是是用之前正确的方式下载的,当前下载方式不正确但用缓存也成功了,就会导致下载者误判):

pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

第二天看,好了:

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

继续:

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言
ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

可以了,跑起来了,接口也能调通:

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言
ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

接下来我们配置python程序启动脚本,脚本中启动python程序前需先激活虚拟环境

注意journalctl -u <servicename>没有及时打印python日志的原因是因为在systemd unit文件中执行shell脚本,脚本中再执行python命令,命令没加-u参数导致的。估计是systemd自动把shell脚本输出重定向到journalctl日志,跟我们之前遇到的问题一样

ky_ai_ip_change.sh

#!/bin/bash

# 打印所有,包括注释
# set -v
# 打印执行命令
# set -x
# 命令出错退出
set -e
# 使用未初始化变量退出
set -u

USER="root"

# --------------------------------------------------------------------------

# 检查是否是root
WHO=$(whoami | grep "${USER}$")
if [ -z "${WHO}" ]; then
    echo
    echo "Please change to \"${USER}\" user mode first!"
    echo
    exit 1
fi

# --------------------------------------------------------------------------

# 获取脚本所在路径
SCRIPT_LOCATION=$(
    cd "$(dirname "$0")" || {
        echo "cd Failure"
        exit 1
    }
    pwd
)
echo "SCRIPT_LOCATION = $SCRIPT_LOCATION"

# --------------------------------------------------------------------------

VENV_NAME=".venv-python3.8"
PYTHON_ENTRY_FILE="ip_change"

# --------------------------------------------------------------------------

# 激活虚拟环境
# 加指令注释消除shellcheck警告,source后有变量就会警告
# shellcheck source=/ky/tml/ky_ai_ip_change/.venv-python3.8/bin/activate
source $SCRIPT_LOCATION/$VENV_NAME/bin/activate
if [ $? -ne 0 ]; then
    echo "Execute [source $SCRIPT_LOCATION/$VENV_NAME/bin/activate] failed"
    exit 1
fi

# 运行项目
# python -u $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE
# if [ $? -ne 0 ]; then
#     echo "Execute [python $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE] failed"
#     exit 1
# fi

# 改一改,避免命令报错直接退出脚本,没有机会退出虚拟环境
if python -u $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE; then
    echo "命令 [python -u $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE] 执行成功"
else
    echo "命令 [python -u $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE] 执行失败"
fi

deactivate
if [ $? -ne 0 ]; then
    echo "Execute [deactivate] failed,退出虚拟环境失败"
    exit 1
fi
echo "Execute [deactivate] successfully,退出虚拟环境成功"

配置.service文件

ky_ai_ip_change.service

[Unit]
Description=ky_ai_ip_change
After=network.target

[Service]
ExecStart=/ky/tml/ky_ai_ip_change/ky_ai_ip_change.sh
WorkingDirectory=/ky/tml/ky_ai_ip_change
Restart=always
RestartSec=3

[Install]
WantedBy=default.target

然后执行部署脚本,成功了

install.sh

#!/bin/bash

# 打印所有,包括注释
# set -v
# 打印执行命令
# set -x
# 命令出错退出
set -e
# 使用未初始化变量退出
set -u

USER=root
# USER_HOME=/root

# --------------------------------------------------------------------------

# 检查是否是root
WHO=$(whoami | grep "${USER}$")
if [ -z "${WHO}" ]; then
    echo
    echo "Please change to \"${USER}\" user mode first!"
    echo
    exit 1
fi

# --------------------------------------------------------------------------

# 获取脚本所在路径
SCRIPT_LOCATION=$(
    cd "$(dirname "$0")" || {
        echo "cd Failure"
        exit 1
    }
    pwd
)
# echo "SCRIPT_LOCATION = $SCRIPT_LOCATION"
chmod 777 ${SCRIPT_LOCATION} -R

# --------------------------------------------------------------------------

# 不同服务只用改 SERVICE_NAME 变量即可
SERVICE_NAME="ky_ai_ip_change"
SERVICE_FILE_NAME="$SERVICE_NAME.service"

SERVICE_SOURCE_FILE_PATH="$SCRIPT_LOCATION/$SERVICE_FILE_NAME"

# 不能在 /etc/systemd/system 中创建子目录吗?(貌似是的,测试很多次都不行)
# SERVICE_TARGET_DIR_NAME="ky_ai_service"
# SERVICE_TARGET_DIR_PATH="/etc/systemd/system/$SERVICE_TARGET_DIR_NAME"
SERVICE_TARGET_DIR_PATH="/etc/systemd/system"

# --------------------------------------------------------------------------

# 创建目标目录
# if [ ! -d "$SERVICE_TARGET_DIR_PATH" ]; then
#     mkdir -p "$SERVICE_TARGET_DIR_PATH"
#     echo "创建目录:[$SERVICE_TARGET_DIR_PATH]"
# else
#     echo "目录已存在,不重新创建:[$SERVICE_TARGET_DIR_PATH]"
# fi
# chmod 777 "$SERVICE_TARGET_DIR_PATH" -R

# --------------------------------------------------------------------------

# 判断服务是否存在
if systemctl list-unit-files --type=service | grep -q "$SERVICE_NAME"; then
    echo "$SERVICE_NAME.service exists"
    # 打印服务状态
    # systemctl status $SERVICE_NAME
    echo
    # 这句明明是打印居然会触发 set -e 报错退出,加上 || true
    # systemctl status $SERVICE_NAME || true
    # 貌似信息比较长时,会有分页等待用户输入阻塞程序,加上 --no-pager 选项
    systemctl status $SERVICE_NAME --no-pager || true
    echo
    # 询问用户是否删除
    read -p "Do you want to delete $SERVICE_NAME.service? (y/n): " choice
    if [[ $choice == "y" || $choice == "Y" ]]; then
        # 删除服务
        systemctl stop $SERVICE_NAME
        echo "已 stop [$SERVICE_NAME] 服务 "
        systemctl disable $SERVICE_NAME
        echo "已 disable [$SERVICE_NAME] 服务"
        # rm /etc/systemd/system/$SERVICE_NAME.service  # 不用删,会自动删的
        systemctl daemon-reload
        echo "已 daemon-reload"
        echo "$SERVICE_NAME.service has been deleted"
    else
        echo "Exiting script"
        exit 0
    fi
else
    echo "$SERVICE_NAME.service not exists"
fi
echo

# --------------------------------------------------------------------------

# 这句明明是打印居然会触发 set -e 报错退出
# systemctl list-unit-files | grep "$SERVICE_NAME"
# systemctl list-unit-files | grep "$SERVICE_NAME" || true

# --------------------------------------------------------------------------

# Function: create_symlink
# Description: Check if a symlink exists and is valid. If it is valid, prompt the user to delete and relink it.
#              If it is invalid, display an error message. If it does not exist, create a new symlink.
# Parameters:
#   $1 - The target path of the symlink
#   $2 - The path of the symlink
# Returns:
#   None

function create_symlink() {
    SRC=$1
    LINK=$2

    if [ -e $LINK ]; then
        if [ -L $LINK ]; then
            echo "The symlink $LINK is valid."
            read -p "Do you want to delete and relink it? (y/n) " choice
            case "$choice" in
            y | Y)
                rm $LINK
                echo "The symlink $LINK has been deleted."
                ;;
            *)
                return 0
                ;;
            esac
        else
            echo "The symlink $LINK is invalid."
        fi
    fi
    echo "Force create soft link: [$LINK -> $SRC]"
    ln -sf $SRC $LINK
    if [ $? -ne 0 ]; then
        echo "Force create soft link: [$LINK -> $SRC] failed"
        exit 1
    fi
    ls -l --color=auto $LINK
}

# --------------------------------------------------------------------------

# 判断软链接/usr/local/bin/node是否存在,如果存在,判断软链接是否有效,如果有效,询问用户是否删除,如果用户选择是,则删除此软链接,并重新创建
SERVICE_TARGET_FILE_PATH="$SERVICE_TARGET_DIR_PATH/$SERVICE_FILE_NAME"
# ls -l --color=auto $NODE_LINK
create_symlink $SERVICE_SOURCE_FILE_PATH $SERVICE_TARGET_FILE_PATH
echo

# --------------------------------------------------------------------------

# 通知systemd重新加载配置文件
systemctl daemon-reload
if [ $? -ne 0 ]; then
    echo "Systemctl daemon-reload failed"
    exit 1
fi
echo "Daemon-reload successfully"

# 启用服务
systemctl enable $SERVICE_NAME
if [ $? -ne 0 ]; then
    echo "Enable service [$SERVICE_NAME] failed"
    exit 1
fi
echo "Enable service [$SERVICE_NAME] successfully"

# 启动服务
systemctl start $SERVICE_NAME
if [ $? -ne 0 ]; then
    echo "Start service [$SERVICE_NAME] failed"
    exit 1
fi
echo "Start service [$SERVICE_NAME] successfully"

# --------------------------------------------------------------------------

echo
# systemctl status $SERVICE_NAME || true
# 貌似信息比较长时,会有分页等待用户输入阻塞程序,加上 --no-pager 选项
systemctl status $SERVICE_NAME --no-pager || true

# --------------------------------------------------------------------------

echo
echo "Service [$SERVICE_FILE_NAME] install successfully"
echo

但是又莫名其妙搞出来一个问题,后面一直不能复现,后来又好了,一直无法复现(考虑问题复现时,使用备用方案)

参考文章:Current command vanished from the unit file, execution of the command list won‘t be resumed.

后面如果又碰到,可以考虑直接systemd unit文件中直接执行python指令而不是脚本,同时定义ExecStartPreExecStopPost执行指令前的激活虚拟环境和退出虚拟环境的操作:


如果使用systemd来执行Python服务,可以在service配置文件中设置ExecStartPreExecStopPost来在执行前进入虚拟环境,执行后退出虚拟环境。

以下是一个示例的service配置文件,展示了如何在执行前进入虚拟环境,执行后退出虚拟环境:

[Unit]
Description=My Python Service

[Service]
ExecStartPre=/bin/bash -c 'source /path/to/venv/bin/activate'
ExecStart=/path/to/python /path/to/script.py
ExecStopPost=/bin/bash -c 'deactivate'

[Install]
WantedBy=multi-user.target

在这个示例中,ExecStartPre指定了在执行前要执行的命令,即进入虚拟环境的命令source /path/to/venv/bin/activateExecStart指定了要执行的Python脚本的路径。ExecStopPost指定了在执行后要执行的命令,即退出虚拟环境的命令deactivate

请将/path/to/venv替换为你的虚拟环境的路径,将/path/to/python替换为你的Python解释器的路径,将/path/to/script.py替换为你的Python脚本的路径。

通过这样的配置,当你启动或停止该service时,会自动进入和退出虚拟环境。

反正现在是正常的

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言
ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

20230811 虚拟环境中搞jtop(jetson-stats)还是有亿点问题

pip3 install -U jetson-stats

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir),linux,shell,Python,python,开发语言文章来源地址https://www.toymoban.com/news/detail-645827.html

到了这里,关于ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python的虚拟环境venv创建和使用

    找了半天python多版本共存下配置虚拟环境,通过网上的资源学习,我将总结如下: AI是这么说的: 虚拟环境是在计算机中创建的一种隔离的、独立的工作区域。它主要用于在一个计算机系统中同时管理多个项目,每个项目都有自己独立的运行环境和依赖项。 虚拟环境的主要

    2024年04月09日
    浏览(52)
  • Python直接复制已有的venv虚拟环境以创建新的虚拟环境

    Windows10 教育版64位 Python 3.10.6 哎,深度学习的环境配置一直是个问题,特别是现在多模态的模型要求更多的包,更多的模型文件。因此怎么移植到其他地方更是一个问题!传统方法可能就是使用 pip freeze 和 pip install 命令来依次安装 requirements.txt 中的包。 这样在我看来可能在

    2023年04月19日
    浏览(50)
  • Python中安装和使用venv虚拟环境

    要在Python中安装和使用venv虚拟环境,您可以按照以下步骤进行操作: 1.首先,确保您已安装了Python。您可以在命令行中输入以下命令来验证Python的安装情况: 2.在您的项目文件夹中创建一个新的虚拟环境。在命令行中,切换到您要创建虚拟环境的目录,并运行以下命令: 这

    2024年02月11日
    浏览(43)
  • [Venv]Windows下Python程序虚拟环境配置

            日常的生活和学习中难免会遇到需要使用其他师傅编写的Python脚本的时候,但是不同的Python脚本需要的环境往往各不相同,如果统统把所有遇到的软件需要的依赖统统安装到本机上,有时候会出现依赖冲突的问题,因此在这里我们使用 Python虚拟环境管理工具venv

    2024年02月03日
    浏览(42)
  • Python:pycharm中 虚拟环境 venv简介及实践

    不进行虚拟化会产生的问题 在平时使用 python 时,有可能会遇到这几个常见的问题: A.当运行的项目处于不同版本时(如 python 2.7/3.7 ),要通过切换 python 解释器的版本来运行程序(或要使用 python2/3 pip/pip3 等指令来对应不同的版本)。 B.有时做一个项目要用到许多第三方模

    2024年02月11日
    浏览(40)
  • Python虚拟环境(Python venv)的创建、激活、退出及删除

      使用Python虚拟环境很重要,它可以确保项目的隔离性、可维护性和稳定性。无论是在Web开发、数据科学、机器学习还是其他领域,使用虚拟环境都是一个有益的最佳实践。 主要理由如下:   不同的Python项目可能需要不同版本的Python和第三方依赖项。使用虚拟环境可以

    2024年02月03日
    浏览(59)
  • python中包管理工具pip以及虚拟环境venv的使用

    查看已安装的包 安装包 卸载包 导出已安装的包 配置全局默认包索引地址 venv是python自带的环境管理工具(好像是3.7版本后才引入的),它的作用是创建虚拟环境,以便更好地管理每个项目中的包。 绝大多数用户使用pycharm时使用的虚拟环境就是它。 最直观的好处就是用pyi

    2024年02月05日
    浏览(56)
  • Python虚拟环境(pipenv、venv、conda一网打尽)[通俗易懂]

    1. 什么是Python环境 要搞清楚什么是虚拟环境,首先要清楚Python的环境指的是什么。当我们在执行python test.py时,思考如下问题: python哪里来?这个主要归功于配置的系统环境变量 PATH ,当我们在命令行中运行程序时,系统会根据 PATH 配置的路径列表依次查寻是否有可执行文件

    2024年02月08日
    浏览(45)
  • 一键打包,随时运行,Python3项目虚拟环境一键整合包的制作(Venv)

    之前我们介绍了如何使用嵌入式 Python3 环境给项目制作一键整合包,在使用嵌入式 Python 环境时,通常是作为另一个应用程序的一部分,而Python3虚拟环境是为了在开发过程中隔离项目所需的 Python 环境。虚拟环境允许我们在同一台计算机上的不同项目中使用不同的 Python 版本和

    2024年02月04日
    浏览(48)
  • python复制已存在的虚拟环境venv,虚拟环境迁移,解决“Fatal error in launcher: Unable to create process using”

    有的时候我们从github上下载下来的python项目直接带有虚拟环境,尤其是那些需要很多很复杂的包的项目,如果能够获得别人配置好的虚拟环境直接拿来用,就可以省很多事。拿到虚拟环境,需要做一些修改才能顺利食用。 一个项目的虚拟环境是由以下4个文件或文件夹组成的

    2024年02月06日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包