Я не маю досвіду щодо пітона, тому якщо в моїх словах є щось не так, просто скажіть мені. Якщо ваша ієрархія файлів влаштована так:
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
Я думаю, що це співпадає з принципом організації ієрархії файлів проектів, ви повинні організувати модулі з різною функцією в різних папках, а просто залишити верхнього абонента зовні, і ви можете імпортувати, як завгодно.