Entendendo uma cadeia de importações em Python

Sei que existem várias perguntas semelhantes, mas estou tendo dificuldades para entender o erro que estou recebendo e a navegação nos documentos e perguntas semelhantes ainda não ajudou. Se alguma coisa, as perguntas semelhantes me fazem sentir que o que estou fazendo está certo.

Eu tenho os seguintes arquivos:

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 / pacote / _iniciar_.py *

EMPTY FILE

Quando eu corropython pack.py desrc/pack diretório, ele funciona (imprime "Hello World!"). No entanto, quando eu corropython main.py desrc diretório, recebo a seguinte exceção:

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

Se eu alterar a linha de importação empack.py parafrom . import util como sugerido, efetivamente ocorre o contrário.main.py é executado com sucesso, porém agorapack.py falha, aumentando:

Traceback (most recent call last):
  File ".../src/pack/pack.py", line 1, in <module>
    from . import util
ValueError: Attempted relative import in non-package

Eu pensaria que as importações são relativas à localização atual e, como tal, você deve ser capaz de construir uma cadeia de importações como essa. Parece-me muito estranho que o módulo importe um arquivo irmão de maneira diferente, dependendo de onde o programa é iniciado.

Alguém pode explicar por que esse erro ocorre de uma maneira, mas não da outra, e se existe alguma maneira de permitir que essa estrutura de arquivos seja executada, se eu quero executar a partir demain.py oupack.py?

questionAnswers(4)

yourAnswerToTheQuestion