в исполняемый файл.

ю, что есть несколько похожих вопросов, но я изо всех сил пытаюсь понять, какую ошибку я получаю, и просмотр документов и подобных вопросов еще не помог. Во всяком случае, подобные вопросы заставляют меня чувствовать, что то, что я делаю, правильно.

У меня есть следующие файлы:

SRC / main.py

from pack import pack

if __name__ == '__main__':
    pack.exec("Hello Universe!")

ЦСИ / пакет / pack.py

import util

def exec(text):
    util.write(text)

if __name__ == '__main__':
    exec("Hello World!")

ЦСИ / пакет / util.py

def write(text):
    print(text)

*ЦСИ / пакет / _в этом_.py *

EMPTY FILE

Когда я бегуpython pack.py изsrc/pack каталог, он работает (выводит «Hello World!»). Однако когда я бегуpython main.py изsrc В каталоге я получаю следующее исключение:

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

Если я изменю строку импорта вpack.py вfrom . import util как и предполагалось, фактически происходит обратное.main.py работает успешно, однако сейчасpack.py терпит неудачу, поднимая:

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

Я бы подумал, что импорт зависит от текущего местоположения, и поэтому вы должны иметь возможность построить цепочку импорта, подобную этой. Мне кажется очень странным, что модуль должен импортировать одноуровневый файл по-разному, в зависимости от того, где запускается программа.

Может кто-нибудь объяснить, почему эта ошибка возникает одним способом, а не другим, и если есть какой-то способ разрешить запуск этой файловой структуры, хочу ли я запустить изmain.py или жеpack.py?

Ответы на вопрос(4)

Ваш ответ на вопрос