我在 Mac 上使用 oh-my-zsh,python 3.6.1。我想运行 crontab 来执行 python3 脚本。
我最近的尝试之一是这个(我发现的 20 个不同的 stackoverflow 答案都不起作用,所以请不要将其作为重复项关闭:
SHELL=/bin/bash
24 12 * * * root source env/latest-env/bin/activate && /usr/local/bin/python3 /path/to/file/data_transfer.py
错误是
ModuleNotFoundError: No module named 'some_module'
,因此它没有激活我的virtual_env,因为该模型存在于最新的虚拟环境中。
在脚本顶部使用 #!env/latest-env/bin/python
并运行它时,我遇到了同样的错误。
我也尝试了 venv 版本:
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
但是这是针对python 2的,所以错误是
NameError: name 'execfile' is not defined
,当我将其更改为exec时,然后我得到NameError: name 'env' is not defined
。但我知道这是我的路。
如何在 crontab 中激活最新的 venv 来运行我的脚本?
创建虚拟环境后,该环境将绑定到其 /bin 子目录中的解释器。因此,您应该会发现一个 crontab 条目,例如
24 12 * * * root /path/to/env/latest-env/bin/python /path/to/file/data_transfer.py
会做你需要的一切。
我面临着类似的挑战,并发现了一种解决方案,可以有效地为每个 cron 作业设置环境变量,这至关重要,因为每个 cron 作业都在新的环境中启动。我创建了一个由 cron 执行的
.sh
脚本,在运行 Python 脚本之前设置必要的环境。这是一个示例脚本:
#!/bin/zsh
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
/Users/me/.pyenv/shims/python /Users/me/my-script.py
设置说明:
PATH
的输出设置 echo $PATH
。which python
找到。确保此脚本可以通过
chmod +x my-cron.sh
执行。
您的 Python 脚本不需要任何特殊的标头或元数据,例如:
import subprocess
import json
# ... rest of the python script.
使用
pyenv shims
管理 Python 版本和依赖项,使用 pyenv global 3.9.18 3.11.5
设置全局 Python 版本。
要将其添加到您的 crontab:
crontab -e
打开 crontab。*/1 * * * * /Users/me/my-cron.sh
。ESC
,键入 :wq
,然后按 Enter
。您将看到一条确认消息:“crontab:安装新的 crontab”。此方法可确保您的 Python 脚本在正确的环境和依赖项下运行,由
pyenv
管理。