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