Импорт классов из родительской папки в Python 3.6 - PullRequest
0 голосов
/ 23 января 2020

В определенной программе у меня есть абстрактный класс, который должен быть реализован в двух разных подпакетах для разных целей. Упрощенная версия этой структуры:

programme/
  __init__.py
  Abstract.py
  pkgA/
    __init__.py
    ClassA.py
  pkgB/
    __init__.py
    ClassB.py

До Python 3.2 (я полагаю), можно было импортировать класс Abstract в подпапку с относительной ссылкой :

from .. import Abstract

Который с Python 3,6 превращает сообщение об ошибке:

ValueError: attempted relative import beyond top-level package

классический (и уродливый ) Альтернативой является добавление родительской папки к пути во время выполнения:

import sys
import os

sys.path.append(os.getcwd() + '/..')
from programme import Abstract

Но это также не удается:

ModuleNotFoundError: No module named 'programme'

Как это теперь сделано с Python 3.6? Желательно без изменения пути во время выполнения.

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Вы можете использовать __init__.py на верхнем уровне, program / __ init__.py, а затем импортировать в подмодуль из программы.

Пример:

# programme/__init__.py
from .Abstrac import Abstract
# programme/Abstract.py
class Abstract:
    def __init__(self):
        print('Abstract')
# programme/pkgA/ClassA.py
from programme import Abstract

class ClassA(Abstract):
    def __init__(self):
        super().__init__()

if __name__ == '__main__':
    a = ClassA()

Обратите внимание, что если вы работаете как скрипт, вы должны сделать:

$ cd programme
$ python -m programme.classA.ClassA
Abstract
1 голос
/ 23 января 2020

Вам нужен уровень выше, чем программа.

Это необходимо добавить к коду:

import os, sys
current_dir = os.path.dirname(os.path.join(os.getcwd(), __file__))
sys.path.append(os.path.normpath(os.path.join(current_dir, '..', '..')))
from programme import Abstract

Это сработало при выполнении python3.7 ClassA.py на programme/pkgA, и оно было выбрано из этого ответа: Окончательный ответ на относительный python импорт

...