2011-01-13 6 views
6

Hinweis: Gelöst. Es stellte sich heraus, dass ich eine frühere Version des gleichen Moduls importierte.Python NameError: Name '<anything>' ist nicht definiert (aber es ist!)

Es ist einfach, ähnliche Themen auf StackOverflow zu finden, wo jemand in einen NameError lief. Die meisten Fragen beziehen sich jedoch auf bestimmte Module und die Lösung besteht oft darin, das Modul zu aktualisieren.

In meinem Fall versuche ich, eine Funktion von einem Modul zu importieren, das ich selbst geschrieben habe. Das Modul heißt InfraPy und befindet sich definitiv auf sys.path. Eine bestimmte Funktion (listToText) in InfraPy gibt einen NameError zurück, aber nur wenn ich versuche, es in ein anderes Skript zu importieren. Innerhalb von InfraPy, unter if __name__=='__main__':, funktioniert die Funktion listToText einwandfrei. Von InfraPy kann ich andere Funktionen ohne Probleme importieren. Einschließlich from InfraPy import * in meinem Skript gibt keine Fehler zurück, bis ich versuche, die listToText-Funktion zu verwenden.

Wie kann dies geschehen?
Wie kann das Importieren einer bestimmten Funktion einen NameError zurückgeben, während das Importieren aller anderen Funktionen in demselben Modul funktioniert?

mit Python 2.6 auf Mac OS X 10.6, begegnet auch den gleichen Fehler das Skript auf Windows 7 ausgeführt wird, mit Ironpython 2.6 für .NET 4.0

Dank.

Wenn es andere Details gibt, von denen Sie denken, dass sie bei der Lösung dieses Problems hilfreich wären, würde ich sie Ihnen gerne zur Verfügung stellen.

Wie gewünscht, hier ist die Funktionsdefinition innerhalb von InfraPy:

def listToText(inputList, folder=None, outputName='list.txt'): 
    ''' 
    Creates a text file from a list (with each list item on a separate line). May be placed in any given folder, but will otherwise be created in the working directory of the python interpreter. 
    ''' 
    fname = outputName 
    if folder != None: 
     fname = folder+'/'+fname 
    f = open(fname, 'w') 
    for file in inputList: 
     f.write(file+'\n') 
    f.close() 

Diese Funktion ist vorstehend definiert ist und außerhalb von if __name__=='__main__':

Ich habe InfraPy um in Bezug auf das Skript versucht, zu bewegen. Die verwirrendste Situation ist, dass, wenn InfraPy im selben Ordner als das Skript ist, und ich mit from InfraPy import listToText importieren, erhalte ich diesen Fehler: NameError: name listToText is not defined. Auch hier sind die anderen Funktionen einwandfrei, sie sind alle außerhalb von if __name__=='__main__': in InfraPy definiert.

+3

Bitte senden Sie die genaue Fehlermeldung, die Sie erhalten. – Amber

+1

können Sie den Quellcode des __InfraPy__ Moduls beschaffen, kann es hier hilfreich sein; Aber meine erste Vermutung ist, dass Sie vielleicht die Funktion __listToText__ im Block definieren 'if __name __ == '__ main __':' haben Sie? ' – mouad

+0

Ich schlage vor, dass Sie Definitionen der Funktionen und/oder Klassen im Modul (dh die "def" - oder "class" -Linien, aber ohne die Körper, zeigen mindestens eine, die von außerhalb des Moduls zugänglich ist, und eine, die nicht ist. –

Antwort

3

passieren Dies könnte, wenn das Modul __all__

Alternativ definiert hat es eine andere Version des Moduls auf Ihrem Weg sein könnte, die Sie erwarten

Ist das NameError über listToText oder statt der importiert wird immer Ist es etwas in der Funktion, die die Ausnahme verursacht?

+0

Danke gnibbler, es scheint eine andere Version des Moduls auf sys.path zu sein. Wenn ich einen neuen Ordner mit InfraPy und einem Testskript erstellte und einige .pth-Dateien aus meinem site-packages-Verzeichnis löschte, funktionierte es einwandfrei. Als ich InfraPy aus diesem neuen Ordner entfernte und die .pth-Dateien wiederherstellte, erhielt ich die gleichen Fehler, die diesen Beitrag ausgelöst hatten. Gefunden und gelöst. Vielen Dank! – BenjaminGolder

3

Zusätzlich die __all__ Variable gnibbler erwähnt, Sie könnten auch ein Problem mit einer InfraPy.pyc Datei irgendwo herumliegen haben.

Ich würde empfehlen, zuerst einen import pdb;pdb.set_trace() in die InfraPy.py-Datei zu stellen, um sicherzustellen, dass Sie in der richtigen Datei sind, und schrittweise durch die Definition von InfraPy.py zu sehen, was passiert. Wenn Sie keinen Haltepunkt erhalten, importieren Sie eine andere Datei als Sie denken.

Sie können auch dir(InfraPy) nach dem Importieren und überprüfen, welche Datei Sie tatsächlich mit InfraPy.__file__ importieren.

Momentan gibt es keine Import-Debugging-Tipps mehr. ;-)

+0

Danke Lennart, der 'InfraPy .__ file__' Tipp ist in diesem Fall besonders nützlich. Ich habe etwas für InfraPy.pyc geangelt und einen gefunden, der das Problem verursacht haben könnte. – BenjaminGolder

Verwandte Themen