Абсолютный импорт не работает в Python 3.7 - PullRequest
1 голос
/ 04 июля 2019

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

Project
   |
   |folder1
   |  |folder2
   |  |  |Script_A.py
   |
   |folder3
   |  |Script_B.py

Я пытаюсь получить доступ к классу с именем ClassB , находящемуся в Script_B.py из Script_A.py в Python 3.7.Я пытаюсь добиться этого, используя абсолютный импорт.Вот содержимое Script_A.py:

from folder3.Script_B import ClassB

Кажется, что-то мне не хватает.Я не понимаю, как Script_A должен знать о существовании Script_B или даже папки folder3 или даже Project .Что говорит python для поиска этих папок?

Я прочитал PEP328 , и это не отвечает ни на один из моих вопросов.

1 Ответ

2 голосов
/ 04 июля 2019

Я бы использовал __init__.py, просто пустой файл, который преобразует папки в модули:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
        subpackage2_1/
              __init___.py
              deep_module.py
module_test.py

Это позволит (в module_test.py)

from package.subpackage2.subpackage2_1 import deep_module

Если deep_moduleимеет класс Foo

# deep_module.py
class Foo: pass

Мы можем импортировать Foo как

from package.subpackage2.subpackage2_1.deep_module import Foo

Я бы не рекомендовал этот тип импорта, так как его сложно отладить.

Вы можете сделать:

from package.subpackage2.subpackage2_1 import deep_module

# it helps to know where class is coming from
foo = deep_module.Foo()

Что лучше, чем импортировать Foo напрямую, но все же я всегда буду стараться избегать его для удобства чтения;)

Если вызовпроизводится в директории пакета, затем

from subpackage2.subpackage2_1 import deep_module

или эта, которая будет работать везде

# terrible hack is to add your package to your sys path
import sys
sys.path.insert(0,'path_to_package')

from package.subpackage2.subpackage2_1 import deep_module
...