в исполняемый файл.
ю, что есть несколько похожих вопросов, но я изо всех сил пытаюсь понять, какую ошибку я получаю, и просмотр документов и подобных вопросов еще не помог. Во всяком случае, подобные вопросы заставляют меня чувствовать, что то, что я делаю, правильно.
У меня есть следующие файлы:
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
?