在 cron 中启动时未找到 Python 模块

在 cron 中启动时未找到 Python 模块

我正在运行一个小型 ubuntu 服务器(版本 18.04)

在升级到 18.04 之前,cron 执行良好。

这是我的 crontab(sudo crontab -e):

*/5  *    * * *  PYTHONPATH=/usr/bin/python3 /usr/bin/python3 /home/louis/backup-server/main.py >> /var/log/MYbackup.log 2>&1

但是当 cron 启动时会记录以下内容:

Traceback (most recent call last):
  File "/home/louis/backup-server/main.py", line 7, in <module>
    import config.config as config
  File "/home/louis/python_helpers/config/config.py", line 2, in <module>
    from dotenv import load_dotenv
ModuleNotFoundError: No module named 'dotenv'

但是如果我运行sudo python3 /home/louis/backup-server/main.py脚本就会正确执行

我确实跑了sudo pip install python-dotenv

脚本内容:

# /home/louis/backup-server/main.py
# permissions : -rwxr-xr-x
import os
import requests
import json
import datetime
import sys
sys.path.insert(0, '/home/louis/python_helpers')
import config.config as config
import mail
import utils

def main():
    # some code

if __name__ == "__main__":
    main()

--

# /home/louis/python_helpers/config/config.py
# permissions : -rwxr-xr-x 
import os
from dotenv import load_dotenv
dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
load_dotenv(dotenv_path)
# some config var

我确实有一个__init__.py文件/home/louis/python_helpers/config,如果我需要添加任何其他信息,请告诉我。

最让我恼火的是,如果手动启动,脚本可以运行良好,但如果以 cron 方式启动则不行。

编辑:我不确定这个问题是属于这里还是属于 stackoverflow,所以请告诉我是否应该移动它(尽管除了创建新问题之外我不知道怎么做)

答案1

嗯,这个问题很愚蠢,我确实运行pip install python-dotenvsudo pip install python-dotenv(脚本需要 root 权限才能访问某些文件夹)但我没有这样做sudo -H pip install python-dotenv

运行此命令后,cron执行正常。

答案2

我今天也遇到了类似的问题,下面是我解决的方法!希望对您有所帮助。

你有两个不同的 Python 吗?尝试运行:

where python3

如果您同时拥有这两者/usr/local/bin/python3/usr/bin/python3并且您的包已安装,/usr/local/lib但您指定在 PYTHONPATH 中使用/usr/bin/python3,它将抛出 ModuleNotFoundError。

您可以:

  1. /usr/local/bin/python3在您的 PYTHONPATH 中指定
  2. 或者在你的 cronjob 中运行/usr/local/bin/python3 FILE
  3. 或者放在#!/usr/local/bin/python3文件的第一行

答案3

问题可能出在这部分:

PYTHONPATH=/usr/bin/python3

因为 PYTHONPATH 应该指向你的库所在的位置。如果你删除 crontab 的那部分会发生什么?

答案4

对于每个用于 cron 作业的用户,您都应该执行 pip install your-library。因为 cron 使用运行该作业的用户的环境。

相关内容