ModuleNotFoundError: ningún módulo llamado 'tensorflow.contrib'; 'tensorflow' no es un paquete

Resuelto DrakeJest asked hace 6 años • 0 respuestas

Estoy intentando comenzar con Tensorflow pero aparece un error. Busqué en Google y en este sitio web pero no encontré respuesta.

Entonces déjame explicarte. Actualmente estoy usando anaconda3 en mi computadora. Utilicé 'Anaconda Prompt' para instalar tensorflow con pip install -q --upgrade tensorflow. Funcionó, pero cuando ejecuto este código (desde aquí ):

from __future__ import absolute_import, division, print_function

import os
import matplotlib.pyplot as plt

import tensorflow as tf
import tensorflow.contrib.eager as tfe

tf.enable_eager_execution()

print("TensorFlow version: {}".format(tf.VERSION))
print("Eager execution : {}".format(tf.executing_eagerly()))

Obtuve el siguiente error:

Traceback (most recent call last):
File "<ipython-input-11-9a561e7b074b>", line 1, in <module>
runfile('C:/Users/emile/Desktop/tensorflow.py', wdir='C:/Users/emile/Desktop')

File "C:\Users\emile\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
execfile(filename, namespace)

File "C:\Users\emile\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Users/emile/Desktop/tensorflow.py", line 6, in <module>
import tensorflow as tf

File "C:\Users\emile\Desktop\tensorflow.py", line 7, in <module>
import tensorflow.contrib.eager as tfe

ModuleNotFoundError: No module named 'tensorflow.contrib'; 'tensorflow' is not a package

¿Quizás el problema sea causado por Anaconda?

Muchas gracias.

DrakeJest avatar Jun 28 '18 02:06 DrakeJest
Aceptado

Un hallazgo interesante, espero que esto ayude a otros que están desarrollando bajo Anaconda o entornos integrados similares donde su programa no se ejecuta directamente desde la línea de comando, por ejemplo, como "python myprogram.py".

El problema podría deberse al hecho de que el programa en sí se llama tensorflow.py. Se ejecuta en un entorno donde no se inicia como módulo "principal", sino que lo carga otro programa Python (anaconda, en este caso).

Cuando un programa Python se carga de esta manera, el intérprete lo lee como un módulo y lo coloca en su lista de módulos (con el mismo nombre que el archivo), por lo que ahora tiene sys.modules["tensorflow"] que apunta al programa de usuario cargado (y NO al módulo tensorflow instalado). Cuando se encuentra la línea 'importar tensorflow as tf', Python ve que "tensorflow" ya está importado y simplemente lo hace tf=sys.modules["tensorflow"], lo cual es una referencia a la suya tensorflow.py(ya es un problema, pero aún no lo ha hecho tf.enable_eager_execution(); fallaría si lo hiciste, porque tu tensorflow.py no tiene esa función).

Ahora, la parte interesante:

import tensorflow.contrib.eager as tfe

Python ya tiene 'tensorflow' importado (¡tu módulo!), por lo que espera encontrar cualquier submódulo en el mismo directorio que el tensorflow.py cargado. En particular, espera que ese directorio sea un paquete de Python (lo tiene __init__.py), pero obviamente no es así, de ahí el mensaje de error "... no es un paquete".

Leo K avatar Jun 27 '2018 20:06 Leo K