Pregunta

Supongamos que tengo una estructura de carpetas similar a esta:

.
├── A
│   ├── a.py
│   └── b.py
└── main.py

Los archivos tienen el siguiente contenido:

b.py:

class BClass:
    pass

a.py:

from b import BClass

principal.py:

from A import a

si corro python3.3 A/a.py o python3.3 B/b.by, no hay errores.Sin embargo, si corro python3.3 main.py, se produce el siguiente error:

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from A import a
  File "/tmp/python_imports/A/a.py", line 1, in <module>
    from b import BClass
ImportError: No module named 'b'

Cambiar la línea de importación en a.py a import A.b funciona, pero obviamente python3.3 A/a.py entonces fracasará.En realidad no estoy interesado en correr. python3.3 A/a.py pero quiero que el módulo se pueda importar desde varias ubicaciones.Por lo tanto, a.py debería importar b.py independientemente de dónde se importe a.py.

¿Cómo se puede resolver este problema?

¿Fue útil?

Solución

junto al __init__.py Mencioné en mi comentario que es obligatorio para los paquetes, es necesario importar el módulo hermano relativamente:

from .b import BClass

Entonces también funciona en Python 3.

Como alternativa, por supuesto, puedes importar el nombre completo:

from A.b import BClass

Pero entonces su módulo no se puede reubicar tan fácilmente dentro de su árbol de paquetes.

Sin embargo, de ninguna manera puedes usar a.py como independiente.Para lograr esto necesitarías rodear el import declaración con try/except y prueba una versión diferente en caso de que la primera falle:

try:
  from .b import BClass
except ValueError:
  from b import BClass

Pero eso es comprensible.En un sistema más grande, los módulos pueden depender de otros módulos. en algún lugar en el paquete; de ​​lo contrario, tal vez no deberían ser parte de un paquete sino independientes.Y si existen tales dependencias, usar un módulo como si fuera independiente, por supuesto, será un problema.

Otros consejos

Necesita un archivo __init__.py (vacío será bien) en el directorio A.De lo contrario, Python no lo reconocerá como un paquete.

Ahora eres un paquete, debe usar importaciones absolutas o importaciones relativas explícitas.En este caso, en A/a.py use from A.b import BClass o from .b import BClass.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top