Как импортировать класс Python, который находится в директории?
Я хочу наследовать от класса в файле, который находится в каталоге выше текущего.
можно ли относительно импортировать этот файл?
5 ответов:
внутри иерархии пакетов используйте две точки, как импорт заявлением доктор сказал:
при указании какого модуля импортировать вам не нужно указывать абсолютное имя модуля. Когда модуль или пакет содержится в другом пакете, можно сделать относительный импорт в том же верхнем пакете без необходимости упоминать имя пакета. Используя ведущие точки в указанном модуле или пакете после
from
вы можете указать, как высокий, чтобы пройти вверх по текущей иерархии пакетов без указания точных имен. Одна ведущая точка означает текущий пакет, в котором существует модуль, выполняющий импорт. две точки означает до одного уровня пакета. Три точки-это два уровня, и т. д. Так что если вы выполнитеfrom . import mod
из модуля вpkg
пакет, то вы будете в конечном итоге импортироватьpkg.mod
. Если вы выполнитеfrom ..subpkg2 import mod
внутриpkg.subpkg1
вы импортируетеpkg.subpkg2.mod
. Спецификация для относительного импорта содержится внутри PEP 328.PEP 328 имеет дело с абсолютным / относительным импортом.
@гимель ответ правильный если вы можете гарантировать иерархию пакетов, которую он упоминает. Если вы не можете - если ваша реальная потребность, как вы выразились, исключительно привязана к каталогам и без какой-либо необходимой связи с упаковкой-тогда вам нужно работать над
__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))