Я не маю досвіду щодо пітона, тому якщо в моїх словах є щось не так, просто скажіть мені. Якщо ваша ієрархія файлів влаштована так:
project\
module_1.py
module_2.py
module_1.pyвизначає функцію, що називається func_1(), module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
і ви запускаєте python module_2.pyв cmd, він буде виконувати те, що func_1()визначає. Це, як правило, ми імпортуємо ті самі ієрархічні файли. Але коли ви пишете from .module_1 import func_1в module_2.pyпітона перекладач скаже No module named '__main__.module_1'; '__main__' is not a package. Отже, щоб виправити це, ми просто збережемо зміни, які ми щойно внесли, і перемістимо обидва модуля до пакету, і зробимо третій модуль як запуск абонента module_2.py.
project\
package_1\
module_1.py
module_2.py
main.py
main.py :
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
Але причина, яку ми додаємо .до цього module_1в, module_2.pyполягає в тому, що якщо ми цього не зробимо і не запустимо main.py, інтерпретатор пітону скаже No module named 'module_1', що це трохи хитро, module_1.pyпрямо поруч module_2.py. Тепер я дозволяю func_1()в module_1.pyзроби що - небудь:
def func_1():
print(__name__)
що __name__записує, хто викликає func_1. Тепер ми зберігаємо .раніше module_1, запускаємо main.py, воно буде друкувати package_1.module_1, а не module_1. Це вказує на те, що той, хто дзвонить, func_1()знаходиться в тій же ієрархії main.py, .що module_1і той самий ієрархій, що і module_2.pyсам. Отже, якщо немає точки, main.pyрозпізнає module_1в тій же ієрархії, що і сама, вона може розпізнати package_1, але не те, що "під".
Тепер давайте зробимо це трохи складніше. У вас є config.iniмодуль, який визначає функцію для його читання в тій же ієрархії, що і "main.py".
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
І з якоїсь неминучої причини вам доведеться викликати це module_2.py, тому він має імпортувати з верхньої ієрархії. module_2.py :
import ..config
pass
Дві крапки означає імпорт із верхньої ієрархії (три крапки мають доступ до верхніх, ніж верхні тощо). Тепер ми запускаємо main.pyінтерпретатор скаже: ValueError:attempted relative import beyond top-level package. "Пакет вищого рівня" тут є main.py. Тільки тому config.py, що поруч main.pyвони є в тій же ієрархії, config.pyне "під" main.py, або не "очолюється" main.py, так що це поза main.py. Для виправлення цього найпростіший спосіб:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
Я думаю, що це співпадає з принципом організації ієрархії файлів проектів, ви повинні організувати модулі з різною функцією в різних папках, а просто залишити верхнього абонента зовні, і ви можете імпортувати, як завгодно.