Как импортировать класс Python, который находится в каталоге выше? - PullRequest
163 голосов
/ 28 июня 2009

Я хочу наследовать от класса в файле, который находится в каталоге выше текущего.

Можно ли относительно импортировать этот файл?

Ответы [ 5 ]

153 голосов
/ 28 июня 2009

Внутри иерархии пакетов используйте две точки, как указано в import import doc:

При указании модуля для импорта не нужно указывать абсолютное имя модуля. Когда модуль или пакет содержится в другом пакете, можно сделать относительный импорт в том же самом верхнем пакете, не упоминая имя пакета. Используя начальные точки в указанном модуле или пакете после from, вы можете указать, как высоко будет проходить текущая иерархия пакетов без указания точных имен. Одна начальная точка означает текущий пакет, в котором существует модуль, выполняющий импорт. Две точки означают один уровень пакета . Три точки выше двух уровней и т. Д. Поэтому, если вы выполните from . import mod из модуля в пакете pkg, то в итоге вы импортируете pkg.mod. Если вы выполните from ..subpkg2 import mod из pkg.subpkg1, вы импортируете pkg.subpkg2.mod. Спецификация для относительного импорта содержится в PEP 328 .

PEP 328 касается абсолютного / относительного импорта.

92 голосов
/ 19 июня 2012
import sys
sys.path.append("..") # Adds higher directory to python modules path.
70 голосов
/ 28 июня 2009

@ gimel ответ правильный если , вы можете гарантировать иерархию пакетов, которую он упоминает. Если вы не можете - если ваша реальная потребность в том виде, в каком вы ее выразили, связана исключительно с каталогами и не имеет никакого отношения к упаковке - тогда вам нужно поработать над __file__, чтобы найти родительский каталог (пару os.path.dirname звонки будут делать ;-), затем (если этот каталог еще не включен sys.path) предварительно временно вставьте указанный каталог в самом начале sys.path, __import__, снова удалите указанный каталог - действительно грязная работа, но «когда вы должны, вы должны» (и Pyhon стремится никогда не мешать программисту делать то, что должно сделать, - так же, как говорится в стандарте ISO C в разделе «Дух C» в предварить -!)

.

Вот пример, который может работать для вас:

import sys
import os.path
sys.path.append(
    os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))

import module_in_parent_dir
33 голосов
/ 16 апреля 2014

Импорт модуля из каталога, который находится ровно на один уровень выше текущего каталога:

from .. import module
0 голосов
/ 16 июня 2015

Python - это модульная система

Python не зависит от файловой системы

Чтобы надежно загрузить код Python, поместите этот код в модуль, а этот модуль - в библиотеку Python.

Установленные модули всегда можно загрузить из пространства имен верхнего уровня с помощью import <name>


Официально доступен отличный пример проекта: https://github.com/pypa/sampleproject

По сути, вы можете создать структуру каталогов, например:

the_foo_project/
    setup.py  

    bar.py           # `import bar`
    foo/
      __init__.py    # `import foo`

      baz.py         # `import foo.baz`

      faz/           # `import foo.faz`
        __init__.py
        daz.py       # `import foo.faz.daz` ... etc.

.

Обязательно укажите setuptools.setup() в setup.py,

официальный пример: https://github.com/pypa/sampleproject/blob/master/setup.py

В нашем случае мы, вероятно, хотим экспортировать bar.py и foo/__init__.py, мой краткий пример:

setup.py

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    ...
    py_modules=['bar'],
    packages=['foo'],
    ...
    entry_points={}, 
        # Note, any changes to your setup.py, like adding to `packages`, or
        # changing `entry_points` will require the module to be reinstalled;
        # `python3 -m pip install --upgrade --editable ./the_foo_project
)

.

Теперь мы можем установить наш модуль в библиотеку python; с помощью pip вы можете установить the_foo_project в вашу библиотеку python в режиме редактирования, так что мы можем работать над этим в режиме реального времени

python3 -m pip install --editable=./the_foo_project

# if you get a permission error, you can always use 
# `pip ... --user` to install in your user python library

.

Теперь из любого контекста Python мы можем загрузить наши общие py_modules и пакеты

foo_script.py

#!/usr/bin/env python3

import bar
import foo

print(dir(bar))
print(dir(foo))
...