Python 属性错误:';str';对象没有属性';格式';:Crontab错误

Python 属性错误:';str';对象没有属性';格式';:Crontab错误,python,crontab,Python,Crontab,我有一个每天00:00 GMT运行的cronjob集。此cronjob执行一个shell脚本,该脚本在内部调用python脚本。python脚本生成一个日志文件作为输出。shell脚本和python脚本位于unix框中的同一目录中(/abc/logs/env/pqr/hvi/)。他们有777权限。现在,当我从这个位置(/abc/logs/env/pqr/hvi/)运行shell脚本时,它执行得很好,python脚本在内部被调用并生成日志文件。但是当通过cronjob执行此操作时,不会生成输出文件

我有一个每天00:00 GMT运行的cronjob集。此cronjob执行一个shell脚本,该脚本在内部调用python脚本。python脚本生成一个日志文件作为输出。shell脚本和python脚本位于unix框中的同一目录中(/abc/logs/env/pqr/hvi/)。他们有777权限。现在,当我从这个位置(/abc/logs/env/pqr/hvi/)运行shell脚本时,它执行得很好,python脚本在内部被调用并生成日志文件。但是当通过cronjob执行此操作时,不会生成输出文件,我会收到一条错误消息说“AttributeError:'str'对象没有属性'format'” 当我做一个时,我得到的是:somelocation/./thirdparty/python/2.6/bin/python 所以我想我使用的是python 2.6,它支持.format操作。 我的猜测是:

  • Python解释器问题,我在cronjob中添加了以下内容:

    PYTHONPATH=/../../../../thirdparty/python/2.6/bin/python 路径=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

  • 但是没有运气

  • Python版本问题,因为它可能不支持datetime的“.format”函数。但我想我使用的是Python2.6(Python显示的是2.6)&它支持datetime的这个函数
  • 不知道问题出在哪里。有人能帮忙吗? 提前谢谢

    Cron作业看起来像:

    PYTHONPATH =/cs/../../thirdparty/python/2.6/bin/python
    PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    00 00 * * 2,3,4,5,6  /abc/logs/env/pqr/hvi/calculate_latency.sh  > /var/tmp/hvi_latency.log 2>&1
    
    #!/usr/bin/ksh
    cd /abc/logs/env/pqr/hvi/
    NOW=$(date +"%F")
    FILE="hvi-latency-$NOW.log"
    zgrep "Received message:" $(date -d '-2 day' '+%Y%m%d')*.hvi.data.log.gz $(date -d'yesterday' +%Y%m%d)/*.data.* | cut -d' ' -f1,2,20,21,22 | sed 's/2016.*gz://' | sed 's/ /|/2'  > $FILE
    chmod 777 $FILE
    python /abc/logs/env/pqr/hvi/HVI_Delay_analyizer_BY_HOUR_usingDatetime.py $FILE /abc/logs/env/pqr/hvi/
    chmod 777 HVI_MaxDelayPerHOUR.log
    cut -d "|" -f2 HVI_MaxDelayPerHOUR.log >HVI_MaxDelay.log
    chmod 777 HVI_MaxDelay.log
    tail -n +2 HVI_MaxDelay.log > HVI_Latency.log
    chmod 777 HVI_Latency.log
    cat HVI_Latency.log > HVI_Latency.txt
    chmod 777 HVI_Latency.txt
    mail -s "DR Latency values for HVI feeder on date:$NOW" sajida.sayyad@gmail.com < HVI_Latency.txt
    
    import os
    import sys
    import time
    import math
    import re
    from datetime import datetime
    from datetime import timedelta
    
    def get_timestamp():
    import datetime
    n = datetime.datetime.now()
    # print n gives : 2016-03-25 04:08:43.123162
    result = '{0:04}-{1:02}-{2:02}_{3:02}{4:02}{5:02}'.format(n.year,n.month,n.day,n.hour,n.minute,n.second)
    # print result gives :2016-03-25_040843
    return result
    
    [..... tmp]$ tail -100 hvi_latency.log 
    2016-03-25 05:31:43.806450
    Traceback (most recent call last):
    File "/abc/logs/env/pqr/hvi/HVI_Delay_analyizer_BY_HOUR_usingDatetime.py", line 119, in ?
    START_TIME = get_timestamp()   
    File "/abc/logs/env/pqr/hvi/HVI_Delay_analyizer_BY_HOUR_usingDatetime.py", line 18, in get_timestamp
    result = '{0:04}-{1:02}-{2:02}_{3:02}{4:02}{5:02}'.format(n.year,n.month,n.day,n.hour,n.minute,n.second)
    AttributeError: 'str' object has no attribute 'format'
    
    Shell脚本看起来像:

    PYTHONPATH =/cs/../../thirdparty/python/2.6/bin/python
    PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    00 00 * * 2,3,4,5,6  /abc/logs/env/pqr/hvi/calculate_latency.sh  > /var/tmp/hvi_latency.log 2>&1
    
    #!/usr/bin/ksh
    cd /abc/logs/env/pqr/hvi/
    NOW=$(date +"%F")
    FILE="hvi-latency-$NOW.log"
    zgrep "Received message:" $(date -d '-2 day' '+%Y%m%d')*.hvi.data.log.gz $(date -d'yesterday' +%Y%m%d)/*.data.* | cut -d' ' -f1,2,20,21,22 | sed 's/2016.*gz://' | sed 's/ /|/2'  > $FILE
    chmod 777 $FILE
    python /abc/logs/env/pqr/hvi/HVI_Delay_analyizer_BY_HOUR_usingDatetime.py $FILE /abc/logs/env/pqr/hvi/
    chmod 777 HVI_MaxDelayPerHOUR.log
    cut -d "|" -f2 HVI_MaxDelayPerHOUR.log >HVI_MaxDelay.log
    chmod 777 HVI_MaxDelay.log
    tail -n +2 HVI_MaxDelay.log > HVI_Latency.log
    chmod 777 HVI_Latency.log
    cat HVI_Latency.log > HVI_Latency.txt
    chmod 777 HVI_Latency.txt
    mail -s "DR Latency values for HVI feeder on date:$NOW" sajida.sayyad@gmail.com < HVI_Latency.txt
    
    import os
    import sys
    import time
    import math
    import re
    from datetime import datetime
    from datetime import timedelta
    
    def get_timestamp():
    import datetime
    n = datetime.datetime.now()
    # print n gives : 2016-03-25 04:08:43.123162
    result = '{0:04}-{1:02}-{2:02}_{3:02}{4:02}{5:02}'.format(n.year,n.month,n.day,n.hour,n.minute,n.second)
    # print result gives :2016-03-25_040843
    return result
    
    [..... tmp]$ tail -100 hvi_latency.log 
    2016-03-25 05:31:43.806450
    Traceback (most recent call last):
    File "/abc/logs/env/pqr/hvi/HVI_Delay_analyizer_BY_HOUR_usingDatetime.py", line 119, in ?
    START_TIME = get_timestamp()   
    File "/abc/logs/env/pqr/hvi/HVI_Delay_analyizer_BY_HOUR_usingDatetime.py", line 18, in get_timestamp
    result = '{0:04}-{1:02}-{2:02}_{3:02}{4:02}{5:02}'.format(n.year,n.month,n.day,n.hour,n.minute,n.second)
    AttributeError: 'str' object has no attribute 'format'
    
    错误消息是:

    PYTHONPATH =/cs/../../thirdparty/python/2.6/bin/python
    PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    00 00 * * 2,3,4,5,6  /abc/logs/env/pqr/hvi/calculate_latency.sh  > /var/tmp/hvi_latency.log 2>&1
    
    #!/usr/bin/ksh
    cd /abc/logs/env/pqr/hvi/
    NOW=$(date +"%F")
    FILE="hvi-latency-$NOW.log"
    zgrep "Received message:" $(date -d '-2 day' '+%Y%m%d')*.hvi.data.log.gz $(date -d'yesterday' +%Y%m%d)/*.data.* | cut -d' ' -f1,2,20,21,22 | sed 's/2016.*gz://' | sed 's/ /|/2'  > $FILE
    chmod 777 $FILE
    python /abc/logs/env/pqr/hvi/HVI_Delay_analyizer_BY_HOUR_usingDatetime.py $FILE /abc/logs/env/pqr/hvi/
    chmod 777 HVI_MaxDelayPerHOUR.log
    cut -d "|" -f2 HVI_MaxDelayPerHOUR.log >HVI_MaxDelay.log
    chmod 777 HVI_MaxDelay.log
    tail -n +2 HVI_MaxDelay.log > HVI_Latency.log
    chmod 777 HVI_Latency.log
    cat HVI_Latency.log > HVI_Latency.txt
    chmod 777 HVI_Latency.txt
    mail -s "DR Latency values for HVI feeder on date:$NOW" sajida.sayyad@gmail.com < HVI_Latency.txt
    
    import os
    import sys
    import time
    import math
    import re
    from datetime import datetime
    from datetime import timedelta
    
    def get_timestamp():
    import datetime
    n = datetime.datetime.now()
    # print n gives : 2016-03-25 04:08:43.123162
    result = '{0:04}-{1:02}-{2:02}_{3:02}{4:02}{5:02}'.format(n.year,n.month,n.day,n.hour,n.minute,n.second)
    # print result gives :2016-03-25_040843
    return result
    
    [..... tmp]$ tail -100 hvi_latency.log 
    2016-03-25 05:31:43.806450
    Traceback (most recent call last):
    File "/abc/logs/env/pqr/hvi/HVI_Delay_analyizer_BY_HOUR_usingDatetime.py", line 119, in ?
    START_TIME = get_timestamp()   
    File "/abc/logs/env/pqr/hvi/HVI_Delay_analyizer_BY_HOUR_usingDatetime.py", line 18, in get_timestamp
    result = '{0:04}-{1:02}-{2:02}_{3:02}{4:02}{5:02}'.format(n.year,n.month,n.day,n.hour,n.minute,n.second)
    AttributeError: 'str' object has no attribute 'format'
    

    somelocation/./thirdparty/python/2.6/bin
    放在路径的左侧-在cron作业中永远不要使用相对路径名,始终使用绝对路径。当您说将.././bin放在路径的左侧是什么意思?我将路径更改为:PATH=/xyz/def/thirdparty/python/2.6/bin/python:/usr/bin:/usr/bin:/usr/sbin:/usr/local/bin。仍然会收到上面提到的相同错误。在调用之前将
    哪个python
    放入shell脚本。将
    打印目录(“”)
    就在失败语句之前。在控制台中启动python并键入
    ''.format
    。您得到了什么?我看到
    PYTHONPATH
    =
    前面有一个可疑的空白。不要使用
    /usr/bin/env
    ,这将得到与依赖
    $PATH
    相同的python,请在
    #!
    。我知道很多人说要使用
    env
    ,但这恰恰说明了这些问题(以及其他问题)。