在线更新内容的 Python 脚本需要虚拟环境才能运行吗?

在线更新内容的 Python 脚本需要虚拟环境才能运行吗?

我一直在尝试在 cron 中安排一个 python 脚本每天运行两次。该脚本使用几个 API 从网站提取信息并用这些信息更新 google 电子表格。该脚本正在运行 - 我可以手动运行它而没有任何问题,但是当我安排它从 cron 作业运行时,我看不到任何输出。

经过一些故障排除后,我发现了这个页面 -https://cronitor.io/cron-reference/cron-troubleshooting-guide

我完成了所有建议的步骤并找到了以下内容:

“对于 Python,您可能会发现您的 Web 应用程序正在使用您需要在 crontab 中调用的虚拟环境。”

如何在 ubuntu 中“调用虚拟环境”?我现在正处于一个不知道如何继续的阶段。如果有帮助的话,我正在 Ubuntu 20.04.3 LTS 上的 raspberry pi 3b 上运行我的脚本,我的脚本正在使用 Googlesheets API。

编辑:到目前为止我已经完成了以下故障排除:

  • 我的用户有权限运行 cron

  • 我在我的 cron 作业中使用直接路径

  • 我已经检查了 chron guru 以确保我的 cron 计划设置正确,并且确实如此。

  • 我从一个 cron 作业中获取输出,该作业将日期和时间打印到文件(* * * * * /path/to/python3.8 /path/to/script/Script.py >> log.txt),所以我知道它正在运行。

  • 我已授予脚本可执行权限chmod +x Script.py

  • 我已确保我的用户有权运行该脚本

  • 我已确保 cron 文件末尾有一个空白行

  • 我创建了一个可执行 shell 文件来执行该脚本

  • 我已确保 cron 使用的时间与系统时间相同

  • tail -f /var/log/syslog在预定的时间显示脚本的输出,但当我检查电子表格是否已更新时,却没有

  • 我在 Python 脚本的顶部添加了 shebang

答案1

Python 虚拟环境是自包含的目录树,其中包含特定版本的 Python 安装以及许多附加包。

假设您的脚本使用“requests”包发出 HTTP 请求。如果您在虚拟环境中安装了请求,则需要确保脚本从 cron 运行时虚拟环境处于活动状态。否则您将得到ImportError: No module named requests

另一方面,如果您在系统范围内安装了请求,并且没有使用虚拟环境,那么您也不需要担心 cron 上下文中的问题。


以下是我解决您的特定问题的方法:我将在脚本中添加日志记录语句来检查假设和假设:脚本是否启动?它是否完全运行?如果它发出 HTTP 请求,它会返回什么 HTTP 状态?

也许脚本抛出了异常,但异常并未记录在任何地方。此代码片段仅捕获 stdout:

* * * * * /path/to/python3.8 /path/to/script/Script.py >> log.txt 

将其更改为同时捕获 stderr:

* * * * * /path/to/python3.8 /path/to/script/Script.py >> log.txt 2>&1

相关内容