Entendiendo una cadena de importaciones en Python
Sé que hay varias preguntas similares, pero estoy luchando por comprender el error que recibo y navegar por los documentos y preguntas similares aún no ha ayudado. En todo caso, las preguntas similares me hacen sentir que lo que estoy haciendo es correcto.
Tengo los siguientes archivos:
src / main.py
from pack import pack
if __name__ == '__main__':
pack.exec("Hello Universe!")
src / pack / pack.py
import util
def exec(text):
util.write(text)
if __name__ == '__main__':
exec("Hello World!")
src / pack / util.py
def write(text):
print(text)
* src / paquete / _en es_. py *
EMPTY FILE
Cuando corropython pack.py
desde elsrc/pack
directorio, funciona (imprime "Hello World!"). Sin embargo, cuando ejecutopython main.py
desde elsrc
directorio obtengo la siguiente excepción:
Traceback (most recent call last):
File ".../src/main.py", line 1, in <module>
from pack import pack
File ".../src/pack/pack.py", line 1, in <module>
import util
ImportError: No module named util
Si cambio la línea de importación enpack.py
afrom . import util
como se sugiere, efectivamente ocurre lo contrario. @main.py
se ejecuta con éxito, sin embargo ahorapack.py
falla, elevando:
Traceback (most recent call last):
File ".../src/pack/pack.py", line 1, in <module>
from . import util
ValueError: Attempted relative import in non-package
Pensé que las importaciones son relativas a la ubicación actual, y como tal, debería poder construir una cadena de importaciones como esta. Me parece muy extraño que se suponga que el módulo importe un archivo hermano de manera diferente dependiendo de dónde se inicie el programa.
Puede alguien explicar por qué este error ocurre de una manera pero no de la otra, y si hay alguna forma de permitir que se ejecute esta estructura de archivos si quiero ejecutar desdemain.py
opack.py
?