Импортировать модуль из относительного пути - PullRequest
731 голосов
/ 11 ноября 2008

Как импортировать модуль Python с учетом его относительного пути?

Например, если dirFoo содержит Foo.py и dirBar, а dirBar содержит Bar.py, как мне импортировать Bar.py в Foo.py?

Вот визуальное представление:

dirFoo\
    Foo.py
    dirBar\
        Bar.py

Foo хочет включить Bar, но реструктуризация иерархии папок невозможна.

Ответы [ 23 ]

11 голосов
/ 20 декабря 2012

Быстрый и грязный способ для пользователей Linux

Если вы просто возитесь и не заботитесь о проблемах развертывания, вы можете использовать символическую ссылку (если ваша файловая система поддерживает это), чтобы сделать модуль или пакет непосредственно видимым в папке запрашивающего модуля.

ln -s (path)/module_name.py

или

ln -s (path)/package_name

Примечание. «Модуль» - это любой файл с расширением .py, а «пакет» - любая папка, содержащая файл __init__.py (который может быть пустым файлом). С точки зрения использования, модули и пакеты идентичны - оба раскрывают содержащиеся в них «определения и утверждения» в соответствии с запросом команды import.

См .: http://docs.python.org/2/tutorial/modules.html

9 голосов
/ 01 сентября 2011
from .dirBar import Bar

вместо:

from dirBar import Bar

на всякий случай может быть установлен еще один dirBar и запутать читателя foo.py.

8 голосов
/ 29 октября 2014

Для этого случая, чтобы импортировать Bar.py в Foo.py, сначала я бы превратил эти папки в пакеты Python так:

dirFoo\
    __init__.py
    Foo.py
    dirBar\
        __init__.py
        Bar.py

Тогда я бы сделал это так в Foo.py:

.
from .dirBar import Bar

Если бы я хотел, чтобы пространство имен выглядело как Bar. независимо от или

from . import dirBar

Если бы я хотел пространство имен dirBar.Bar. независимо от . Этот второй случай полезен, если в пакете dirBar имеется больше модулей.

6 голосов
/ 28 февраля 2010

Добавить файл __ init __. Py :

dirFoo\
    Foo.py
    dirBar\
        __init__.py
        Bar.py

Затем добавьте этот код в начало Foo.py:

.
import sys
sys.path.append('dirBar')
import Bar
5 голосов
/ 29 июля 2014

Пример относительного sys.path:

# /lib/my_module.py
# /src/test.py


if __name__ == '__main__' and __package__ is None:
    sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib')))
import my_module

На основании этого ответа.

4 голосов
/ 02 апреля 2015

Ну, как вы упоминаете, обычно вы хотите иметь доступ к папке с вашими модулями относительно места запуска вашего основного скрипта, поэтому вы просто импортируете их.

Решение:

У меня есть скрипт в D:/Books/MyBooks.py и некоторые модули (например, oldies.py). Мне нужно импортировать из подкаталога D:/Books/includes:

import sys,site
site.addsitedir(sys.path[0] + '\\includes')
print (sys.path)  # Just verify it is there
import oldies

Поместите print('done') в oldies.py, чтобы убедиться, что все идет хорошо. Этот способ всегда работает, потому что по определению Python sys.path, инициализированному при запуске программы, первый элемент этого списка, path[0], является каталогом, содержащим скрипт, который использовался для вызова интерпретатора Python.

Если каталог скриптов недоступен (например, если интерпретатор вызывается в интерактивном режиме или если скрипт читается из стандартного ввода), path[0] - это пустая строка, которая направляет Python для поиска модулей в текущем каталоге в первую очередь. Обратите внимание, что каталог сценария вставляется перед записями, вставленными в результате PYTHONPATH.

3 голосов
/ 26 января 2018

Просто вы можете использовать: from Desktop.filename import something

Пример:

учитывая, что файл имеет имя test.py в каталоге Users/user/Desktop и будет импортировать все.

код:

from Desktop.test import *

Но убедитесь, что вы создали пустой файл с именем "__init__.py" в этом каталоге

3 голосов
/ 07 августа 2016

Другое решение - установить пакет py-require , а затем использовать следующее в Foo.py

import require
Bar = require('./dirBar/Bar')
2 голосов
/ 09 февраля 2011

Посмотрите на модуль pkgutil из стандартной библиотеки. Это может помочь вам сделать то, что вы хотите.

2 голосов
/ 27 января 2012

Вот способ импортировать файл с уровня выше, используя относительный путь.

По сути, просто переместите рабочий каталог на уровень (или любое другое относительное местоположение), добавьте его в свой путь, затем переместите рабочий каталог туда, где он был запущен.

#to import from one level above:
cwd = os.getcwd()
os.chdir("..")
below_path =  os.getcwd()
sys.path.append(below_path)
os.chdir(cwd)
...