使用Shell脚本自动启动基于venv的Python程序报错排查
解决Shell脚本结合at命令运行venv虚拟环境Python程序时的
source: not found错误 问题描述
希望通过Shell脚本结合at命令自动运行依赖venv虚拟环境的Python程序,手动在命令行激活venv正常,但脚本执行时出现如下错误:
run.sh: 7: source: not found
原脚本内容:
#!/bin/bash # Path to your virtual environment activate script VENV_PATH="/home/user/python/app/venv/bin/activate" # Activate the virtual environment source "$VENV_PATH" # Run your Python program python3 /home/user/python/app/main.py
解决方案
方案1:替换source为POSIX标准的点命令(.)
source是bash专属内置命令,而at默认可能使用/bin/sh执行脚本,部分sh环境不支持source,但POSIX标准的点命令.是通用的,修改脚本中的激活命令:
#!/bin/bash # Path to your virtual environment activate script VENV_PATH="/home/user/python/app/venv/bin/activate" # Activate the virtual environment . "$VENV_PATH" # Run your Python program python3 /home/user/python/app/main.py
方案2:强制at使用bash执行脚本
调用at时,明确指定用bash运行你的脚本,避免at默认使用sh:
at now + 1 minute <<EOF bash /home/user/python/app/run.sh EOF
方案3:直接调用虚拟环境内的Python解释器(推荐)
无需激活虚拟环境,直接使用venv目录下的Python解释器运行程序,彻底规避shell兼容问题:
#!/bin/bash # 直接使用虚拟环境中的Python解释器执行程序 /home/user/python/app/venv/bin/python3 /home/user/python/app/main.py
问题原因
at命令默认使用系统默认shell(通常是/bin/sh)执行任务,即使脚本开头声明了#!/bin/bash,at仍可能忽略该shebang,改用sh运行。而sh中没有source内置命令(或部分环境不支持),因此触发source: not found错误。
内容的提问来源于stack exchange,提问作者user3188777
相关产品推荐
相关产品推荐

