2011-01-13 9 views
6

Nota: Resuelto. Resultó que estaba importando una versión anterior del mismo módulo.python NameError: name '<anything>' no está definido (pero lo es!)

Es fácil encontrar temas similares en StackOverflow, donde alguien se encontró con un NameError. Pero la mayoría de las preguntas se refieren a módulos específicos y la solución a menudo es actualizar el módulo.

En mi caso, estoy tratando de importar una función de un módulo que yo misma escribí. El módulo se llama InfraPy, y definitivamente está en sys.path. Una función particular (llamada listToText) en InfraPy devuelve un NameError, pero solo cuando intento importarlo a otro script. Dentro de InfraPy, bajo if __name__=='__main__':, la función listToText funciona bien. Desde InfraPy puedo importar otras funciones sin problemas. Incluir from InfraPy import * en mi script no devuelve ningún error hasta que intento usar la función listToText.

¿Cómo puede ocurrir esto?
¿Cómo puede la importación de una función en particular devolver un NameError, mientras que la importación de todas las otras funciones en el mismo módulo funciona bien?

usando Python 2.6 en MacOSX 10.6, también se encontró con el mismo error al ejecutar la secuencia de comandos en Windows 7, utilizando IronPython 2.6 para .NET 4.0

Gracias.

Si hay otros detalles que crees que serían útiles para resolver esto, estaré encantado de proporcionarlos.

a lo solicitado, aquí es la definición de la función dentro de 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() 

Esta función se define arriba y fuera del if __name__=='__main__':

He intentado InfraPy moverse en relación con el guión. La situación más desconcertante es que cuando InfraPy es en la misma carpeta que el script, e importo usando from InfraPy import listToText, recibo este error: NameError: name listToText is not defined. Nuevamente, las otras funciones importan bien, todas están definidas fuera de if __name__=='__main__': en InfraPy.

+3

Por favor, publique el mensaje de error exacto que está recibiendo. – Amber

+1

puede obtener el código fuente del módulo __InfraPy__, puede ser útil aquí; pero mi primera suposición es que tal vez definas la función __listToText__ en el lado del bloque 'if __name __ == '__ main __':' has? ' – mouad

+0

Te sugiero que publiques definiciones de las funciones y/o clases en el módulo (es decir, líneas 'def' o 'clase', pero sin los cuerpos), que muestra al menos uno a los que se puede acceder desde fuera del módulo y otro que no. –

Respuesta

3

Esto podría ocurrir si el módulo tiene __all__ definido

Alternativamente podría haber otra versión del módulo de su ruta que está siendo importada en lugar de la persona que está esperando

Es la NameError sobre listToText o ¿es algo dentro de la función que causa la excepción?

+0

Gracias gnibbler, parece ser otra versión del módulo en sys.path. Cuando creo una nueva carpeta con InfraPy y un script de prueba, y eliminé algunos archivos .pth de mi directorio site-packages, funcionó bien. cuando eliminé InfraPy de esa nueva carpeta y restauré los archivos .pth, recibí los mismos errores que inicié esta publicación. Encontrado y resuelto. ¡Gracias! – BenjaminGolder

3

Además, el gnibbler variable __all__ mencionó que también podría haber un problema con un archivo InfraPy.pyc en alguna parte.

Recomendaría poner un import pdb;pdb.set_trace() primero en el archivo InfraPy.py para asegurarse de que está en el archivo correcto, y recorrer la definición de InfraPy.py para ver qué está sucediendo. Si no obtiene un punto de interrupción, está importando otro archivo de lo que cree.

También puede dir(InfraPy) después de importarlo, y compruebe qué archivo está realmente importando con InfraPy.__file__.

No se me ocurre ninguna otra sugerencia de eliminación de errores en este momento. ;-)

+0

Gracias a Lennart, la sugerencia 'InfraPy .__ file__' en particular es muy útil en este caso. Hice algo de pesca para InfraPy.pyc y encontré uno que podría haber estado causando el problema. – BenjaminGolder

Cuestiones relacionadas