我在 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 运行时环境。
但是肯定有一些差异,但我找不到它们。 我真的很感激任何想法或提示去哪里寻找。
我没有直接启动 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 &
最后但并非最不重要的一点: 非常感谢菲利普和他的评论。 它引导我解决问题。