bash-terminal-和 crontab@reboot- 以及 ssh-执行期间的不同 Python 版本(使用 pyenv 时)

问题描述 投票:0回答:1

我在 Raspberry Pi 上使用 pyenv 2.3.22,带有 ./profile 条目:

export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

因为我想在系统启动时执行Python程序,所以我通过crontab -e添加了一个@reboot条目。

一切正常,但我得到了不同的 Python 运行时环境,但我找不到原因和修复方法:

bash terminal: Python 3.11.4
crontab start: Python 3.9.2

由于 crontab 调用时的差异,我的程序无法正常运行。

我将程序启动封装在 bash 脚本中,以获取 crontab @reboot 情况的信息。除了不同的 Python 版本之外,一切(用户 ID、路径等)看起来都不错。

我在另一个 Raspberry Pi 上也有类似的环境。那里的情况更糟:

**bash terminal:**
python  --version.    -> 3.11.4
python3 --version.    -> 3.11.4
**crontab start:**
python  --version     -> 2.7.16
python3 --version.    -> 3.7.3

我希望这两种程序启动方法有相同的 Python 运行时环境。

我还可以通过 ssh 从远程主机运行该程序。它还显示了本地 bash 终端执行的不同环境。

但是肯定有一些差异,但我找不到它们。 我真的很感激任何想法或提示去哪里寻找。

python bash cron pyenv reboot
1个回答
0
投票

我没有直接启动 Python 程序,而是围绕它编写了一个 shell 脚本包装器。这给了我在运行时的洞察力,让我执行和检查正确的准备设置(甚至在我的 Mac 上)。

!/bin/bash
echo "startup.sh"
echo "========================"
echo "Initializing environment"
echo "------------------------"
echo "$SHELL"
myname="$(hostname -s)"
if [[ "$myname" = "MyMac" ]]
then
    echo "MacOS"
    . $HOME/.zprofile
    . $HOME/.zshrc
else
    echo "Raspberry Pi"
    . $HOME/.profile
fi
echo "$myname"
cd ~
echo "------------------------"
echo "Environment information:"
echo "------------------------"
echo "$SHELL"
whoami
echo $myname
pwd
echo "pyenv --version:"
if [[ "$myname" = "MyMac" ]]
then
    $HOME/.pyenv/bin/pyenv --version
else
    pyenv --version
fi
echo "python --version:"
python --version
echo "python3 --version:"
python3 --version
echo "-------------------"
echo "Starting Server.py:"
echo "-------------------"
date
nohup ./Server.py >./Server.log 2>&1 &

最后但并非最不重要的一点: 非常感谢菲利普和他的评论。 它引导我解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.