Я долгое время читал абсолютный и относительный импорт, и ничего не помогло.
Скажем, у меня есть модуль python, структурированный так:
└── test_project
├── __init__.py
├── script1.py
├── script2.py
└── main.py
__init__.py
пусто script1.py
имеет функции script2.py
обращается к скрипту1. Это может быть достигнуто с помощью from . import script1
, import .script1
(относительное) или import script1
(абсолютное) main.py
- это сценарий, который запускает функцию из script1 в командной строке и, следовательно, включает if '__name__'==__main__:
за которым следует некоторая версия import script1
Я хочу иметь возможность импортировать script2 в терминал python как вне, так и внутри папки и запускать скрипт main.py в командной строке как снаружи, так и внутри папки, т.е. python test_project/main.py
.
Несмотря на множество попыток, я не могу найти способ написать команды импорта, чтобы import script2
работал во всех этих случаях.
Например, если я использую from . import script1
в main и script2 и запускаю from test_project import script2
в python извне папки, он работает нормально. Но если я запускаю python test_project/main.py
или пытаюсь импортировать в python, находясь в папке, я получаю:
Traceback (most recent call last):
File "test_project/main.py", line 1, in <module>
from . import script1
ImportError: attempted relative import with no known parent package
Я могу попытаться изменить импорт как абсолютный, чтобы исправить это. Например, чтобы main и script2 имели import script1
, а не были относительными. Теперь запуск main и импорт из python в папке в порядке, но импорт извне папки с from test_project import script2
дает:
<ipython-input-1-c3cdbe7a7496> in <module>
----> 1 from test_project import script2
~/python/test_project/script2.py in <module>
----> 1 import script1
ModuleNotFoundError: No module named 'script1'
. Следовательно, невозможно написать операторы импорта в таком каким образом эти функции возможны?