在python3 mac上用crontab打开venv

42fyovps  于 2023-11-15  发布在  Python
关注(0)|答案(2)|浏览(94)

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

kknvjkwl

kknvjkwl1#

一旦创建了虚拟环境,环境就在其 /bin 目录中绑定到解释器。

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

字符串
会做你需要的一切

iyfamqjs

iyfamqjs2#

我也遇到了类似的挑战,并发现了一种解决方案,可以有效地为每个cron作业设置环境变量,这一点至关重要,因为每个cron作业都是在全新的环境中启动的,每个cron作业可能需要不同的变量。我创建了一个由cron执行的.sh脚本,在运行Python脚本之前设置了必要的环境。下面是一个示例脚本:

#!/bin/zsh
export PATH=/usr/bin:/bin:/usr/sbin:/sbin # set your paths.
# set any other env variable, or execute any other action to init the cron env.
/Users/me/.pyenv/shims/python /Users/me/my-script.py

字符串
设置说明:

  • 在终端中使用echo $PATH的输出设置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版本。其他Python管理解决方案也可以工作。
要将其添加到crontab:
1.在终端中使用crontab -e打开crontab。
1.像这样定义你的cron作业和脚本路径:*/1 * * * * /Users/me/my-cron.sh。(这个例子将每分钟运行一次)
1.要保存并退出,请按ESC,键入:wqwrite,quit),然后按Enter。您将看到一条确认消息:“crontab:installing new crontab”。
这种方法可以确保Python脚本在正确的环境和依赖项下运行,由pyenv管理。

相关问题