【问题标题】:Cannot run a python script using crontab无法使用 crontab 运行 python 脚本
【发布时间】:2024-07-05 14:25:01
【问题描述】:

我正在努力将 python 脚本作为 cron 作业运行。

我以 root 身份登录 python脚本的权限是

-rwxr-xr-x 1 root root 2374 Mar  1 22:49 k_collab_spark.2.py

我用

开始脚本
#!/usr/bin/env python

我测试了 pythong 脚本 如果我做“./k_collab_spark.2.py`这工作正常。

在 crontab 上,我将作业设置为

15 12 * * * /opt/lampp/htdocs/testme/SPARK/k_collab_spark.2.py >> /var/log/kspark.log

我在日志文件中没有看到任何消息

一旦我添加 2>&1,它会给出错误 Traceback(最近一次调用最后一次): 文件“/opt/lampp/htdocs/kabeer/SPARK/k_collab_spark.2.py”,第 2 行,在 导入请求 ImportError: No module named requests 但如果我手动执行服务它是成功的。当我手动运行它时,它工作正常

尝试定义路径但仍然是同样的问题

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 导入请求 ImportError:没有名为 requests 的模块

知道我错过了什么。感谢您对此的任何帮助。

【问题讨论】:

  • pythong :-)
  • 您在日志文件中看到什么了吗?您没有提及您使用的是哪个 Linux,但这通常是 /var/log/cron。运行它的用户也有可能收到带有错误的邮件,因此请务必检查(如果/etc/aliases 中没有别名,请登录并运行mail,或检查/var/mail/$user

标签: python linux


【解决方案1】:
  1. 能否在脚本名称前显式添加python
  2. 在 crontab 行的末尾添加2>&1,它也将错误消息重定向到日志文件。详细说明见此链接In the shell, what does " 2>&1 " mean?
  3. 您当前的用户和root 也有可能运行不同版本的python。

【讨论】:

  • 一旦我添加了 2>&1,它会给出错误 Traceback(最近一次调用最后一次):文件“/opt/lampp/htdocs/kabeer/SPARK/k_collab_spark.2.py”,第 2 行,在 import requests ImportError: No module named requests 但如果我手动执行服务,它是成功的。当我手动运行它时,它工作正常
  • 似乎crontab有时可以有不同的环境,见*.com/questions/2388087/…。如果您根据链接在 crontab 中手动设置 PATH 或 PYTHONPATH 它应该可以工作。
  • 从珍珠脚本调用python脚本是个好主意吗?
  • 当您说您手动运行它时,您是以 root 用户还是其他用户身份运行它?
  • 你能把它加到python代码的开头看看它是否有效吗? import sys, sys.path.append('/path_to_your_lib')
【解决方案2】:

尝试使用另一个第一行运行脚本:

#!/usr/bin/python

如果它成功执行,python 解释器中的问题,因为当您安装了多个版本的 Python 时,/usr/bin/env 将确保使用的解释器 - 是您环境 $PATH 上的第一个,我猜 没有请求库

【讨论】:

    【解决方案3】:

    我使用了一个 shell 脚本来调用 python 脚本。盒子上的蟒蛇惹了麻烦

    导出路径=/opt/anaconda3/bin:$PATH /opt/anaconda3/bin/python /opt/lampp/htdocs/scriptme.py >/opt/lampp/htdocs/scriptme.log 2>&1

    【讨论】:

      【解决方案4】:

      将以下代码行添加到您的脚本并编辑 crontab:

      from distutils.sysconfig import get_python_lib
      print(get_python_lib())
      

      现在检查 crontab 中的日志,你会得到一些路径

      e.g. "/usr/lib/python2.7/dist-packages"
      

      cd(change directory) 到上述路径,ls(list directory) 检查包是否存在; 如果不是

      sudo pip3 install requests -t . # dot indicates current directory 
      

      否则,如果您有 requirements.txt 文件,那么您可以尝试:

      sudo pip3 install -r requirements.txt -t "/usr/lib/python2.7/dist-packages" 
      #try this from the directory where  "requirements.txt" file exists
      

      现在运行你的脚本。

      【讨论】:

        最近更新 更多