我正在运行一个小型 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-dotenv
了sudo 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。
您可以:
/usr/local/bin/python3
在您的 PYTHONPATH 中指定- 或者在你的 cronjob 中运行
/usr/local/bin/python3 FILE
。 - 或者放在
#!/usr/local/bin/python3
文件的第一行
答案3
问题可能出在这部分:
PYTHONPATH=/usr/bin/python3
因为 PYTHONPATH 应该指向你的库所在的位置。如果你删除 crontab 的那部分会发生什么?
答案4
对于每个用于 cron 作业的用户,您都应该执行 pip install your-library
。因为 cron 使用运行该作业的用户的环境。