Подтвердить что ты не робот

Импортировать модуль python NOT по пути

У меня есть модуль foo, содержащий util.py и bar.py.

Я хочу импортировать его в сеансе IDLE или python. Как мне это сделать?

Я не могу найти документацию о том, как импортировать модули не в текущий каталог или Python по умолчанию python. Попробовав import "<full path>/foo/util.py", и from "<full path>" import util

Ближе всего я мог получить

import imp
imp.load_source('foo.util','C:/.../dir/dir2/foo')

Что дало мне разрешение на Windows 7.

4b9b3361

Ответ 1

Один из способов - просто изменить ваш path:

import sys
sys.path.append('C:/full/path')
from foo import util,bar

Обратите внимание, что для этого требуется, чтобы foo был пакетом python, т.е. содержал файл __init__.py. Если вы не хотите изменять sys.path, вы можете также изменить переменную среды PYTHONPATH или установить модуль в вашей системе. Помните, что это означает, что другие каталоги или файлы .py в этом каталоге могут быть загружены непреднамеренно.

Следовательно, вы можете вместо этого использовать imp.load_source. Ему нужно имя файла, а не каталог (в файл, который текущий пользователь может читать):

import imp
util = imp.load_source('util', 'C:/full/path/foo/util.py')

Ответ 2

Вы можете настроить путь поиска модуля с помощью переменной среды PYTHONPATH или вручную изменить список каталогов sys.path.

См. Документация по модулю Поиск > на python.org.

Ответ 3

Попробуйте

import sys
sys.path.append('c:/.../dir/dir2')
import foo

Ответ 4

Следуя подсказке phihag, у меня есть это решение. Просто укажите путь к исходному файлу load_src и он загрузит его. Вы также должны указать имя, чтобы вы могли импортировать этот модуль, используя это имя. Я предпочитаю делать это так, потому что он более явный:

def load_src(name, fpath):
    import os, imp
    return imp.load_source(name, os.path.join(os.path.dirname(__file__), fpath))

load_src("util", "../util.py")
import util

print util.method()

Другой (менее явный) способ:

util = load_src("util", "../util.py")    # "import util" is implied here

print util.method()    # works, util was imported by the previous line

Изменить: этот метод переписан, чтобы сделать его более понятным.