Как импортировать класс Python, который находится в директории?


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

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

5 141

5 ответов:

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

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

PEP 328 имеет дело с абсолютным / относительным импортом.

import sys
sys.path.append("..") # Adds higher directory to python modules path.

@гимель ответ правильный если вы можете гарантировать иерархию пакетов, которую он упоминает. Если вы не можете - если ваша реальная потребность, как вы выразились, исключительно привязана к каталогам и без какой-либо необходимой связи с упаковкой-тогда вам нужно работать над __file__ чтобы узнать родительский каталог (пару os.path.dirname вызовы будут делать; -), то (если этот каталог еще не включен sys.path) добавить временно вставить сказал dir в самом начале 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

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

from .. import module

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 ; с Пипом, ты можно установить 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))