2013-05-28 29 views
10

Unten ist der Code, an dem ich arbeite. Von dem, was ich sagen kann, gibt es kein Problem, aber wenn ich versuche, den Code zu starten, erhalte ich einen Fehler.Timedelta ist nicht definiert

import os 
import datetime 

def parseOptions(): 

    import optparse 
    parser = optparse.OptionParser(usage= '-h') 
    parser.add_option('-t', '--type', \ 
         choices= ('Warning', 'Error', 'Information', 'All'), \ 
         help= 'The type of error', 
         default= 'Warning') 
    parser.add_option('-g', '--goback', \ 
         type= 'string') 
    (options, args) = parser.parse_args() 
    return options 

options = parseOptions() now = datetime.datetime.now() subtract = timedelta(hours=options.goback) difference = now - subtract 

if options.type=='All' and options.goback==24: 
    os.startfile('logfile.htm') 

else: 
    print 
    print 'Type =', options.type, 
    print 
    print 'Go Back =', options.goback,'hours' 
    print difference.strftime("%H:%M:%S %a, %B %d %Y") 
    print 

Fehler ist wie folgt:

Traceback (most recent call last): 
    File "C:\Python27\Lib\SITE-P~1\PYTHON~2\pywin\framework\scriptutils.py", line 325, in RunScript 
    exec codeObject in __main__.__dict__ 
    File "C:\Users\user\Desktop\Python\python.py", line 19, in <module> 
    subtract = timedelta(hours=options.goback) 
NameError: name 'timedelta' is not defined 

Jede Hilfe würde geschätzt.

Antwort

16

Sie haben Datetime importiert, aber nicht definiert Timedelta. Sie wollen entweder:

from datetime import timedelta 

oder:

subtract = datetime.timedelta(hours=options.goback) 

Auch Ihre goback Parameter als String definiert ist, aber Sie können es dann als die Anzahl der Stunden zu Timedelta übergeben. Sie müssen es in eine ganze Zahl umwandeln, oder besser noch setzen Sie das type Argument in Ihrer Option auf int stattdessen.

+0

Perfekt, vielen Dank für die Hilfe. Ich denke, es ist viel einfacher zu bedienen: 'datetime.timedelta' und ich habe den Typ zu int geändert. Danke nochmal. – Mitchell

+0

Ja, wenn Sie Datetime importiert haben, indem Sie auf die Datedelta-Klasse mit "datetime.timedelta" verweisen, wäre dies die übliche Best Practice. Der Punkt ist, dass das Importieren des Datetime-Moduls alle Namen, die es definiert, erhält, aber Sie müssen sie über seinen Namespace referenzieren. Sie werden das allgemeine Muster des Importierens eines Moduls sehen und dann sehr oft auf seinen Inhalt verweisen. –

1

Es sollte datetime.timedelta

2

, wo Sie timedelta haben, müssen Sie datetime. bevor es setzen, es ist so tatsächlich datetime.timedelta

0

Ich finde dieses Problem in einigen meiner sutpid Aktion auftreten können. Ich erstelle eine Datei mit dem Namen datetime.py und auch wenn ich die Datei umbenenne, lasse ich die datetime.pyc immer noch im Ordner ... Also wird jede Datei, die Datetime importiert, diese Datei verwenden und timedelta kann nicht gefunden werden. Nachdem ich die Datei gelöscht habe: datetime.pyc, funktioniert es.