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:
config.py
debug = True
prueba.py
import config
print (config.debug)
Yo tambien tengo un __init__.py
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. :)
python
python-3.x
package
python-import
relative-import
blitzmann
fuente
fuente
python test.py
, y funciona perfectamente bien. No tengo pyCharm, pero quizás haya alguna configuración incorrecta de pyCharm que esté causando el problemaRespuestas:
TL; DR: no puede realizar importaciones relativas desde el archivo que ejecuta, ya que el
__main__
módulo no forma parte de un paquete.Importaciones absolutas : importe algo disponible en
sys.path
Importaciones relativas : importar algo relacionado con el 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
main.py
archivo con la estructura general de directorios de esta manera:Y vamos a actualizar test.py para ver qué está pasando:
Ejecutemos test.py primero:
Aquí "prueba" es el
__main__
módulo y no sabe nada acerca de pertenecer a un paquete. Sin embargo,import config
debería funcionar, ya que laryan
carpeta se agregará a sys.path.Ejecutemos main.py en su lugar:
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
__init__.py
archivos.fuente
sys.path.append('/some/path/my_module')
dentro de/some/path/my_module/__init__.py
?sys.path
durante el tiempo de ejecución ( github.com/… ). También puede establecer la variable de entorno PYTHONPATH.__init__.py
archivos". Interesante. ¿Puedes dar más detalles sobre esto? Yo tenía la impresión de que el mecanismo de resolución de paquete no ha cambiado mucho entre 2 y 3.__init__.py
archivos". Por el contrario, ¿puede describir cosas si queremos que un paquete funcione tanto en 2 como en 3? Y vea el lamentablemente desactualizado 2009 ¿__init__.py
Para qué sirve ? y su respuesta más votada "Es parte de un paquete" . Necesitamos comenzar a enfatizar la distinción "paquete regular [antiguo, anterior a 3.3]" vs "paquete de espacio de nombres [3.3+]" en todas partes y con frecuencia.Me lo imaginé. Muy frustrante, especialmente viniendo de python2.
Debe agregar
.
a al módulo, independientemente de si es relativo o absoluto.Creé la configuración del directorio de la siguiente manera.
modx.py
mody.py
main.py
cuando ejecuto main, esto es lo que sucede
Ejecuté 2to3, y el resultado central fue este
Tuve que modificar la declaración de importación de mody.py para solucionarlo
Luego ejecuté main.py nuevamente y obtuve el resultado esperado
Por último, solo para limpiarlo y hacerlo portátil entre 2 y 3.
fuente
try/except
procedimiento de carga es el ingrediente real que funciona aquí (como algunas personas necesitarán usartry:scripts.modx
yexcept: modx
), y fue lo que resolvió este problema para mí.Establecer PYTHONPATH también puede ayudar con este problema.
Así es como se puede hacer en Windows
set PYTHONPATH=.
fuente
Debe agregar la ruta del módulo a
PYTHONPATH
.Para UNIX (Linux, OSX, ...)
Para ventanas
fuente
Probé tu ejemplo
Esto funcionará para mí:
Probado con Python: 3.4.2 - PyCharm 2016.3.2
Además de esto, PyCharm te ofrece Importar este nombre .
Tiene que hacer clic
config
y aparece un icono de ayuda .fuente
Simplemente puede agregar el siguiente archivo a su directorio de pruebas, y luego Python lo ejecutará antes de las pruebas
fuente
Establezca
PYTHONPATH
la variable de entorno en el directorio del proyecto raíz.Considerando como UNIX:
fuente
Este ejemplo funciona en Python 3.6.
Sugiero ir a
Run -> Edit Configurations
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 ...).
fuente
Declare la lista correcta de sys.path antes de llamar al módulo:
fuente
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 :)
fuente
Si está utilizando Python 3+, intente agregar las siguientes líneas
fuente
Tratar
Lo que hace es importar desde el mismo nivel de carpeta. Si intentas importarlo directamente, se supone que es un subordinado
fuente