在 python3 mac 上使用 crontab 打开 venv

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

我在 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 来运行我的脚本?

python python-3.x cron python-venv
2个回答
1
投票

创建虚拟环境后,该环境将绑定到其 /bin 子目录中的解释器。因此,您应该会发现一个 crontab 条目,例如

24 12 * * * root /path/to/env/latest-env/bin/python /path/to/file/data_transfer.py

会做你需要的一切。


0
投票

我面临着类似的挑战,并发现了一种解决方案,可以有效地为每个 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
  • 使用Python可执行文件的绝对路径,通过
    which python
    找到。
  • 提供 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:

  1. 使用
    crontab -e
    打开 crontab。
  2. 定义您的 cron 作业和脚本路径,如下所示:
    */1 * * * * /Users/me/my-cron.sh
  3. 要保存并退出,请按
    ESC
    ,键入
    :wq
    ,然后按
    Enter
    。您将看到一条确认消息:“crontab:安装新的 crontab”。

此方法可确保您的 Python 脚本在正确的环境和依赖项下运行,由

pyenv
管理。

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