tag 网站托管公司,uc浏览器直接进入,关于搜索引擎的搜索技巧,东莞网站建设(推荐乐云践新)文章目录 参考文章目录结构步骤安装venv查看python版本创建虚拟环境激活虚拟环境运行我们程序看缺少哪些依赖库#xff0c;依次安装它们接下来我们配置python程序启动脚本#xff0c;脚本中启动python程序前需先激活虚拟环境配置.service文件然后执行部署脚本#xff0c;成功… 文章目录 参考文章目录结构步骤安装venv查看python版本创建虚拟环境激活虚拟环境运行我们程序看缺少哪些依赖库依次安装它们接下来我们配置python程序启动脚本脚本中启动python程序前需先激活虚拟环境配置.service文件然后执行部署脚本成功了但是又莫名其妙搞出来一个问题后面一直不能复现后来又好了一直无法复现考虑问题复现时使用备用方案反正现在是正常的 20230811 虚拟环境中搞jtopjetson-stats还是有亿点问题 参考文章
Python虚拟环境使用教程以虚拟环境管理工具venv为例virtualenv、venv、pyenv、virtualenvwrapper、conda不同管理工具对比
目录结构 步骤
安装venv
它会基于当前版本的python3来安装python3-venv apt update apt install python3.8-venv查看python版本
执行python 创建虚拟环境
进入项目目录执行
python3 -m venv .venv-python3.8我把每个项目虚拟环境固定取名为.venv-python3.8后续方便脚本操作
20230813改了不这么搞了容易混淆每个虚拟环境都应该有自己特定的名字
python3 -m venv .venv-python3.8-ky_ai_ip_change可以看到生成了目录.venv-python3.8
我这刚生成的虚拟环境占空间也不大才7兆多 激活虚拟环境
source .venv-python3.8/bin/activate运行我们程序看缺少哪些依赖库依次安装它们
执行
python3 ip_change发现少了ping3装上
pip install ping3反复执行
python3 ip_change缺少啥库就装啥库 下载太慢我换成清华源怎么还给我卡住了
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent20230813如果有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第二天看好了 继续 可以了跑起来了接口也能调通 接下来我们配置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 -uUSERroot# --------------------------------------------------------------------------# 检查是否是root
WHO$(whoami | grep ${USER}$)
if [ -z ${WHO} ]; thenechoecho Please change to \${USER}\ user mode first!echoexit 1
fi# --------------------------------------------------------------------------# 获取脚本所在路径
SCRIPT_LOCATION$(cd $(dirname $0) || {echo cd Failureexit 1}pwd
)
echo SCRIPT_LOCATION $SCRIPT_LOCATION# --------------------------------------------------------------------------VENV_NAME.venv-python3.8
PYTHON_ENTRY_FILEip_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 ]; thenecho Execute [source $SCRIPT_LOCATION/$VENV_NAME/bin/activate] failedexit 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; thenecho 命令 [python -u $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE] 执行成功
elseecho 命令 [python -u $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE] 执行失败
fideactivate
if [ $? -ne 0 ]; thenecho Execute [deactivate] failed退出虚拟环境失败exit 1
fi
echo Execute [deactivate] successfully退出虚拟环境成功
配置.service文件
ky_ai_ip_change.service
[Unit]
Descriptionky_ai_ip_change
Afternetwork.target[Service]
ExecStart/ky/tml/ky_ai_ip_change/ky_ai_ip_change.sh
WorkingDirectory/ky/tml/ky_ai_ip_change
Restartalways
RestartSec3[Install]
WantedBydefault.target然后执行部署脚本成功了
install.sh
#!/bin/bash# 打印所有包括注释
# set -v
# 打印执行命令
# set -x
# 命令出错退出
set -e
# 使用未初始化变量退出
set -uUSERroot
# USER_HOME/root# --------------------------------------------------------------------------# 检查是否是root
WHO$(whoami | grep ${USER}$)
if [ -z ${WHO} ]; thenechoecho Please change to \${USER}\ user mode first!echoexit 1
fi# --------------------------------------------------------------------------# 获取脚本所在路径
SCRIPT_LOCATION$(cd $(dirname $0) || {echo cd Failureexit 1}pwd
)
# echo SCRIPT_LOCATION $SCRIPT_LOCATION
chmod 777 ${SCRIPT_LOCATION} -R# --------------------------------------------------------------------------# 不同服务只用改 SERVICE_NAME 变量即可
SERVICE_NAMEky_ai_ip_change
SERVICE_FILE_NAME$SERVICE_NAME.serviceSERVICE_SOURCE_FILE_PATH$SCRIPT_LOCATION/$SERVICE_FILE_NAME# 不能在 /etc/systemd/system 中创建子目录吗貌似是的测试很多次都不行
# SERVICE_TARGET_DIR_NAMEky_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 --typeservice | grep -q $SERVICE_NAME; thenecho $SERVICE_NAME.service exists# 打印服务状态# systemctl status $SERVICE_NAMEecho# 这句明明是打印居然会触发 set -e 报错退出加上 || true# systemctl status $SERVICE_NAME || true# 貌似信息比较长时会有分页等待用户输入阻塞程序加上 --no-pager 选项systemctl status $SERVICE_NAME --no-pager || trueecho# 询问用户是否删除read -p Do you want to delete $SERVICE_NAME.service? (y/n): choiceif [[ $choice y || $choice Y ]]; then# 删除服务systemctl stop $SERVICE_NAMEecho 已 stop [$SERVICE_NAME] 服务 systemctl disable $SERVICE_NAMEecho 已 disable [$SERVICE_NAME] 服务# rm /etc/systemd/system/$SERVICE_NAME.service # 不用删会自动删的systemctl daemon-reloadecho 已 daemon-reloadecho $SERVICE_NAME.service has been deletedelseecho Exiting scriptexit 0fi
elseecho $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:
# Nonefunction create_symlink() {SRC$1LINK$2if [ -e $LINK ]; thenif [ -L $LINK ]; thenecho The symlink $LINK is valid.read -p Do you want to delete and relink it? (y/n) choicecase $choice iny | Y)rm $LINKecho The symlink $LINK has been deleted.;;*)return 0;;esacelseecho The symlink $LINK is invalid.fifiecho Force create soft link: [$LINK - $SRC]ln -sf $SRC $LINKif [ $? -ne 0 ]; thenecho Force create soft link: [$LINK - $SRC] failedexit 1fils -l --colorauto $LINK
}# --------------------------------------------------------------------------# 判断软链接/usr/local/bin/node是否存在如果存在判断软链接是否有效如果有效询问用户是否删除如果用户选择是则删除此软链接并重新创建
SERVICE_TARGET_FILE_PATH$SERVICE_TARGET_DIR_PATH/$SERVICE_FILE_NAME
# ls -l --colorauto $NODE_LINK
create_symlink $SERVICE_SOURCE_FILE_PATH $SERVICE_TARGET_FILE_PATH
echo# --------------------------------------------------------------------------# 通知systemd重新加载配置文件
systemctl daemon-reload
if [ $? -ne 0 ]; thenecho Systemctl daemon-reload failedexit 1
fi
echo Daemon-reload successfully# 启用服务
systemctl enable $SERVICE_NAME
if [ $? -ne 0 ]; thenecho Enable service [$SERVICE_NAME] failedexit 1
fi
echo Enable service [$SERVICE_NAME] successfully# 启动服务
systemctl start $SERVICE_NAME
if [ $? -ne 0 ]; thenecho Start service [$SERVICE_NAME] failedexit 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指令而不是脚本同时定义ExecStartPre和ExecStopPost执行指令前的激活虚拟环境和退出虚拟环境的操作 如果使用systemd来执行Python服务可以在service配置文件中设置ExecStartPre和ExecStopPost来在执行前进入虚拟环境执行后退出虚拟环境。
以下是一个示例的service配置文件展示了如何在执行前进入虚拟环境执行后退出虚拟环境
[Unit]
DescriptionMy 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]
WantedBymulti-user.target在这个示例中ExecStartPre指定了在执行前要执行的命令即进入虚拟环境的命令source /path/to/venv/bin/activate。ExecStart指定了要执行的Python脚本的路径。ExecStopPost指定了在执行后要执行的命令即退出虚拟环境的命令deactivate。
请将/path/to/venv替换为你的虚拟环境的路径将/path/to/python替换为你的Python解释器的路径将/path/to/script.py替换为你的Python脚本的路径。
通过这样的配置当你启动或停止该service时会自动进入和退出虚拟环境。
反正现在是正常的 20230811 虚拟环境中搞jtopjetson-stats还是有亿点问题
pip3 install -U jetson-stats