modulenotfounderror - python3: ImportError: no hay un módulo llamado xxxx
no module named folder python (1)
Esta pregunta ya tiene una respuesta aquí:
- Cambios en la declaración de importación python3 4 respuestas
Soy nuevo en Python y estoy tratando de entender un problema, que veo al crear un paquete. Tengo la siguiente estructura de archivos: (El directorio de trabajo es / my / Python / jmLib2)
/my/Python/jmLib2
|--- Phone
| |--- __init__.py
| |--- Pots.py
|- Test2.py
---------------------------------
cat ./jmLib2/Pots.py
#!/usr/bin/python
def Pots():
print ("I''m Pots Phone")
---------------------------------
cat ./jmLib2/__init__.py
from Pots import Pots
---------------------------------
cat ./Test2.py
#!/usr/bin/python
from Phone import Pots
import os.path
print ("OS:"+str(os.path))
Pots()
Cuando ahora hago:
python2 Test2.py
OS:<module ''posixpath'' from ''/usr/lib/python2.7/posixpath.pyc''>
I''m Pots Phone*
GRAN ... PERO, si lo hago:
python3 Test2.py
Traceback (most recent call last):
File "Test2.py", line 2, in <module>
from Phone import Pots
File "/home/juergen/my/Python/jmLib2/Phone/__init__.py", line 1, in <module>
from Pots import Pots
ImportError: No module named ''Pots''
Estoy trabajando con PyDev bajo Eclipse. PyDev me informa dentro del archivo init .py un error "Importar sin resolver: Ollas". Tengo el mismo problema de rastreo en PyDev y bash.
Una vez más, soy nuevo en Python ... así que tal vez sea un error muy estúpido. Pero, ¿puede alguien explicarme la diferencia entre python2 y python3.4? ¿Tengo que modificar el PYTHONPATH? ¿Por qué?
Saludos juergen
TL; DR: Las importaciones relativas se han ido . Utilice importaciones absolutas en su lugar.
Cualquiera de los dos utilizar
from Phone.Pots import Pots
o:
from .Pots import Pots
El problema se produce porque Pots
es parte del paquete del Phone
: no hay ningún módulo llamado Pots
, hay un módulo llamado Phone.Pots
.
Python 2 tenía una característica llamada importaciones relativas que te permiten escribir import Pots
incluso si eso no era técnicamente correcto.
Las importaciones relativas sin embargo son una fuente de problemas y confusión :
- Quien lee el código no puede decir inmediatamente si la importación es de un paquete o no.
- ¿Cómo es que el módulo se llama
Phone.Pots
, pero puedo usarPhone.Pots
import Pots
? Esto es altamente inconsistente. - ¿Qué pasa si el submódulo oculta el nombre de otro módulo?
Por estas razones, las importaciones relativas se eliminaron de Python 3.
Puede deshacerse de las importaciones relativas de Python 2 utilizando una importación __future__
:
from __future__ import absolute_import