python - pyplot - Importaciones relativas-ModuleNotFoundError: ningún módulo llamado x
title plt python (9)
Como se indicó en los comentarios a la publicación original, esto parecía ser un problema con el intérprete de Python que estaba usando por cualquier razón, y no algo mal con los scripts de Python. Cambié del paquete WinPython al python 3.6 oficial de python.org y funcionó bien. gracias por la ayuda a todos :)
Esta es la primera vez que realmente me senté y probé Python 3, y parece estar fallando miserablemente. Tengo los siguientes dos archivos:
- prueba.py
- config.py
config.py tiene algunas funciones definidas, así como algunas variables. Lo he despojado a lo siguiente:
Sin embargo, recibo el siguiente error:
ModuleNotFoundError: No module named ''config''
Soy consciente de que la convención py3 es usar importaciones absolutas:
from . import config
Sin embargo, esto lleva al siguiente error:
ImportError: cannot import name ''config''
Así que no sé qué hacer aquí ... Cualquier ayuda es muy apreciada. :)
Debe agregar la ruta del módulo a
PYTHONPATH
:
import os, sys
#''/home/user/example/parent/child''
current_path = os.path.abspath(''.'')
#''/home/user/example/parent''
parent_path = os.path.dirname(current_path)
sys.path.append(parent_path)
os.environ.setdefault(''DJANGO_SETTINGS_MODULE'', ''child.settings'')
Declare la lista correcta de sys.path antes de llamar al módulo:
import os, sys #''/home/user/example/parent/child'' current_path = os.path.abspath(''.'') #''/home/user/example/parent'' parent_path = os.path.dirname(current_path) sys.path.append(parent_path) os.environ.setdefault(''DJANGO_SETTINGS_MODULE'', ''child.settings'')
Establecer PYTHONPATH también puede ayudar con este problema.
Así es como se puede hacer en Windows
set PYTHONPATH=.
Este ejemplo funciona en Python 3.6.
Sugiero ir a
Run -> Edit Configurations
en PyCharm, eliminar cualquier entrada allí e intentar ejecutar el código a través de PyCharm nuevamente.
Si eso no funciona, verifique su intérprete de proyecto (Configuración -> Intérprete de proyecto) y ejecute los valores predeterminados de configuración (Ejecutar -> Editar configuraciones ...).
Me lo imaginé. Muy frustrante, especialmente viniendo de python2.
Tienes que agregar a
.
al módulo, independientemente de si es relativo o no.
Creé la configuración del directorio de la siguiente manera.
/main.py
--/lib
--/__init__.py
--/mody.py
--/modx.py
modx.py
def does_something():
return "I gave you this string."
mody.py
from modx import does_something
def loaded():
string = does_something()
print(string)
main.py
from lib import mody
mody.loaded()
cuando ejecuto main, esto es lo que sucede
$ python main.py
Traceback (most recent call last):
File "main.py", line 2, in <module>
from lib import mody
File "/mnt/c/Users/Austin/Dropbox/Source/Python/virtualenviron/mock/package/lib/mody.py", line 1, in <module>
from modx import does_something
ImportError: No module named ''modx''
Ejecuté 2to3, y el resultado principal fue este
RefactoringTool: Refactored lib/mody.py
--- lib/mody.py (original)
+++ lib/mody.py (refactored)
@@ -1,4 +1,4 @@
-from modx import does_something
+from .modx import does_something
def loaded():
string = does_something()
RefactoringTool: Files that need to be modified:
RefactoringTool: lib/modx.py
RefactoringTool: lib/mody.py
Tuve que modificar la declaración de importación de mody.py para solucionarlo
try:
from modx import does_something
except ImportError:
from .modx import does_something
def loaded():
string = does_something()
print(string)
Luego ejecuté main.py nuevamente y obtuve el resultado esperado
$ python main.py
I gave you this string.
Por último, solo para limpiarlo y hacerlo portátil entre 2 y 3.
from __future__ import absolute_import
from .modx import does_something
Probé tu ejemplo
from . import config
obtuvo el siguiente SystemError:
/usr/bin/python3.4 test.py
Rastreo (llamadas recientes más última):
Archivo "test.py", línea 1, en
de . importar config
SystemError: el módulo principal '''' no está cargado, no se puede realizar la importación relativa
Esto funcionará para mí:
import config
print(''debug=%s''%config.debug)
>>>debug=True
Probado con Python: 3.4.2 - PyCharm 2016.3.2
Además de esto, PyCharm te ofrece
Importar este nombre
.
Tienes que hacer clic en
config
y aparece un
icono de ayuda
.
Simplemente puede agregar el siguiente archivo a su directorio de pruebas, y luego Python lo ejecutará antes de las pruebas
__init__.py file
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ''..'')))
TL; DR:
no puede realizar importaciones relativas desde el archivo que
ejecuta
ya que el módulo
__main__
no forma parte de un paquete.
Importaciones absolutas
: importe algo disponible en
sys.path
Importaciones relativas : importar algo relativo al módulo actual, debe ser parte de un paquete
Si ejecuta ambas variantes exactamente de la misma manera, una de ellas debería funcionar.
De todos modos, aquí hay un ejemplo que debería ayudarlo a comprender lo que está sucediendo, agreguemos otro archivo
main.py
con la estructura general de directorios de esta manera:
.
./main.py
./ryan/__init__.py
./ryan/config.py
./ryan/test.py
Y vamos a actualizar test.py para ver qué está pasando:
# config.py
debug = True
# test.py
print(__name__)
try:
# Trying to find module in the parent package
from . import config
print(config.debug)
del config
except ImportError:
print(''Relative import failed'')
try:
# Trying to find module on sys.path
import config
print(config.debug)
except ModuleNotFoundError:
print(''Absolute import failed'')
# main.py
import ryan.test
Ejecutemos test.py primero:
$ python ryan/test.py
__main__
Relative import failed
True
Aquí "test"
es
el módulo
__main__
y no sabe nada acerca de pertenecer a un paquete.
Sin embargo, la
import config
debería funcionar, ya que la carpeta
ryan
se agregará a sys.path.
Ejecutemos main.py en su lugar:
$ python main.py
ryan.test
True
Absolute import failed
Y aquí la prueba está dentro del paquete "ryan" y puede realizar importaciones relativas.
import config
falla ya que las importaciones relativas implícitas no están permitidas en Python 3.
Espero que esto haya ayudado.
PD: si te quedas con Python 3, no hay más necesidad de archivos
__init__.py
.