【问题标题】:"ImportError: No module named requests" in crontab Python scriptcrontab Python 脚本中的“ImportError:没有名为请求的模块”
【发布时间】:2020-03-05 09:51:18
【问题描述】:

我正在尝试在 crontab 中设置 Python 脚本。我有以下内容:

0-59 * * * * python ~/PycharmProjects/dailySearch.py trees >> ~/woah.log 2>&1

在我的日志文件中,我收到了ImportError: No module named requests。我已经搜索了其他 SO 问题并尝试了各种建议,但均未成功。

当我在 IDLE 中运行脚本时,sys.version 将我的版本显示为 3.7.1 (default, Dec 14 2018, 13:28:58)

我安装了两个 Python 版本,虽然我正在运行 python3 (3.7.1),但我不确定我的请求和 pip 是否也安装在它应该安装的位置

python3 位于:/Users/jaai/anaconda3/bin/python3

pip3:/Users/jaai/anaconda3/bin/pip3

为了确认我正在使用 pip3 安装请求,我运行了 sudo pip3 install requests 并使用以下内容:

Requirement already satisfied: requests in /Users/jaai/anaconda3/lib/python3.7/site-packages (2.22.0)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /Users/jaai/anaconda3/lib/python3.7/site-packages (from requests) (1.24.1)
Requirement already satisfied: certifi>=2017.4.17 in /Users/jaai/anaconda3/lib/python3.7/site-packages (from requests) (2018.11.29)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /Users/jaai/anaconda3/lib/python3.7/site-packages (from requests) (3.0.4)
Requirement already satisfied: idna<2.9,>=2.5 in /Users/jaai/anaconda3/lib/python3.7/site-packages (from requests) (2.8)

感谢任何帮助!

【问题讨论】:

    标签: python python-3.x cron


    【解决方案1】:

    有几件事可能是罪魁祸首,但为了确保您运行的解释器与使用的 cron 相同,请确保包含 python3 的完整路径,即

    0-59 * * * * /Users/jaai/anaconda3/bin/python3/python ~/PycharmProjects/dailySearch.py trees >> ~/woah.log 2>&1
    

    如果问题仍然存在,那么也许您应该考虑为 cron 设置 PYTHONPATH 环境变量,以便它与您的 shell 设置的匹配。

    【讨论】:

    • 您的解决方案有效,谢谢。我很好奇为什么它不起作用。我忘了提到我已经尝试设置别名 (alias python=/Users/jaai/anaconda3/bin/python3)。此外,如果我只是在终端中运行python,我可以确认它是 3.7 版。
    【解决方案2】:

    我在 Ubuntu 18.04 上遇到了同样的问题,并且在 crontab 中使用显式路径不起作用。出于某种原因,cron 不起作用,而我帐户中的 sudo 确实起作用。我本以为它们会是一样的,但很可惜,它们不是。我得出的结论是这是一个环境变量问题。

    对我来说,解决方法是让 crontab 调用一个 shell 脚本,然后执行 python 脚本。还必须设置 HOMEPYTHONPATH 环境变量:

    crontab:

    # Execute shell script and pipe stdout and stderr to a log file
    # Which will enable you to see what's going on
    * * * * * <your_path>/yourscript.sh  >> <your_path>yourscript_cron.log 2>&1
    

    你的脚本.sh:

    #!/bin/bash
    echo yourscript.sh called: `date`
    HOME=<your_home_dir>
    PYTHONPATH=<path_to_dist_packages>
    cd <path_to_your_python_script>
    <python_executable> ./<your_python_script> 2>&1 1>/dev/null
    

    很有趣,这个 shell 包装器方法是我过去在 windows 上解决计划任务的方式,因为它为您提供了最好的调试和灵活性。

    希望这对其他人有所帮助。

    【讨论】:

    • 刚刚确认它是 HOME 环境变量,在 cron 和使用 sudo 之间是不同的。当我运行以下命令时,它就像 cron 一样失败: sudo bash -c "HOME=FOO;python3 -c \"import psutil\"" 。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多