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
?