【问题标题】:python script stops at import statement when script is run as cronjob当脚本作为 cronjob 运行时,python 脚本在 import 语句处停止
【发布时间】:2018-07-13 19:53:57
【问题描述】:

我每 30 分钟使用 cron 执行一个 python 脚本,但它在 import 语句处停止,我不明白为什么,因为我没有得到任何反馈。

在我的 crontab 中,我有 */30 * * * * sh exec_script.sh

文件exec_script.sh

cd /home/ziofil/python_scripts
python script_30_mins.py

在我有的python脚本中

import logging
logging.basicConfig(filename="explicit_log.txt",level=logging.DEBUG)
logger = logging.getLogger(__name__)

logger.debug("script is executed")

# in the python_scripts folder there is a subfolder utilities/ that
# contains utility_1.py, were I define the class Utility
from utilities.utility_1 import Utility
logger.debug("Utility loaded")

utility = Utility()
logger.debug("object creation")

utility.do_your_thing()
logger.debug("done its thing")

如果我从终端执行 python script_30_minutes.py,一切正常,但使用 cron 时,执行会在 import 语句处停止(我读到“脚本已执行”,但要注意其他)。

出了什么问题?

更新:我将 import 语句放在 try/except 块中,它记录了异常:“没有名为 utility.utility_1 的模块”。我也尝试将shell脚本中的PYTHONPATH变量设置为/home/ziofil/python_scripts,但还是不行。

【问题讨论】:

  • 在大多数情况下,这是因为 cron 没有设置 PATH 变量。所以它在你的文件系统中找不到“python”。尝试在您的 exec_scripts.sh 中执行以下操作:/usr/lib/python2.7 script_30_mins.py(检查路径是否存在,也许您有另一个 python 版本,因此路径不同)。
  • 但是python脚本执行了:它创建了文件“explicit_log.txt”并在里面写了一行。您认为这仍然是 PATH 变量问题吗?
  • @UweMannl:PATH 没有问题。产生了输出,因此 Python 解释器正在执行。
  • @mhawke 你是对的,现在看到了。所以看起来解释器停在from utilities.utility_1 import Utility。在这种情况下,解决方案应该是您的答案。
  • @UweMannl 你是对的:这是 python 二进制 cron 使用的问题。

标签: python bash cron


【解决方案1】:

我发现了问题所在。 @UweMannl 一直都是对的。在@mhawke 指出 cron 的环境与我的终端不同之后,我想也许 python 二进制文件也可能不同,实际上是:我想要 /home/ziofil/anaconda3/bin/python 而 cron 正在使用 /usr/bin/python

我将脚本的最后一行修改为/home/ziofil/anaconda3/bin/python script_30_mins.py,一切正常!

【讨论】:

    【解决方案2】:

    cron 运行与终端环境不同的进程。可能您在终端中设置了PYTHONPATH,但在您的 cron 环境中没有。如果是这种情况,您可以将其添加到您的 shell 脚本中:

    export PYTHONPATH=/home/ziofil/python_scripts/whatever:$PYTHONPATH
    cd /home/ziofil/python_scripts
    python script_30_mins.py
    

    【讨论】:

    • 我刚刚检查过,PYTHONPATH 也没有在我的终端中设置,echo $PYTHONPATH 返回一个空行。尽管如此,我在 shell 脚本中将它设置为.../python_scripts,但没有运气。我还将 import 语句包装在 try/except 中,并记录了异常:“No module named utility.utility_1”。
    • @Ziofil 您是否以普通用户 oder root 身份运行 cron? (这是你的 crontab 还是你用 sudo 编辑它?)... PS:你的导出应该是 export PYTHONPATH=/home/ziofil/python_scripts/:$PYTHONPATH
    • 啊!我发现了问题。我在脚本中添加了“echo which python > whichpy.txt”,我发现 cron 使用的是 v2.7.12 的 /usr/bin/python,而我的终端使用的是 v3.6.3 的 /home/ziofil/anaconda3/bin/python。我将脚本调用改为/home/ziofil/anaconda3/bin/python script_30_mins.py,一切正常。
    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多