Импортировать модуль 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.
Ответы
Ответ 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
Изменить: этот метод переписан, чтобы сделать его более понятным.