Загрузка модулей в одном пакете Python - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть структура каталогов, подобная этой:

myPackage /
    __init__.py
    module1
    module2
    module3
    ...

Некоторые из этих модулей зависят от других модулей в пакете.По некоторым причинам, я считаю, что импорт из, например, module1 в module2 не работает, если я напишу это так:

from module1 import func1, func2, ...

Это говорит о том, что нет модуля с именем module1, я могу'выяснить, почему ... Это не должно работать?Есть ли какие-либо известные подводные камни, которые могут вызвать эту проблему?И есть ли другой подход для загрузки модулей в одном пакете, который является предпочтительным?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Ну, я хотел бы объяснить немного больше.

Каждая программа на Python имеет один и только один глобальный иерархический модуль управления.Модули в sys.path являются верхними модулями.Итак, возьмите ваш код в качестве примера:

root
----myPackage
--------module1 <- this is what you want.
--------module2
----module1 <- this does not exist.

Несмотря на то, что вы загружаете module1 в module2, ему все равно необходимо подчиняться текущему управлению модулями, которое начинается вне пакета.

Этот дизайниспользуется для обеспечения синглтона на модулях.Все импортированные модули кэшируются в sys.modules, поэтому для уникальной идентификации одного модуля все модули управляются на основе иерархии.

Другой пример:

В модуле 2:

from myPackage import module1

И в вашем основном файле:

from myPackage import module2
import sys
print(sys.modules)

Вы увидите один модуль с именем myPackage.module1, хотя он импортирован в myPackage.module2, но не называется myPackage.module2.myPackage.module1.

0 голосов
/ 10 декабря 2018

module1 не на вашем пути, поэтому from module1 import xyz не будет работать (так как module1 не может быть найден).

Вы можете обновить импорт до

from myPackage.module1 import xyz

или

from .module1 import xyz

Второй вариант хорош тем, что позволяет избежать дублирования имени пакета внутри пакета, но это будет означать, что вы не можете легко выполнить ваш module1 напрямую (например, python module1.py).Если вам не нужно выполнять его напрямую, тогда нет проблем.

...