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