Импорт модуля python не по пути

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

Я хочу импортировать его в IDLE или 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.

4 ответов


один из способов - просто изменить свой путь:

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

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

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

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

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

посмотреть Путь Поиска Модуля документация на python.org.


попробовать

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

следуя подсказке фихага, у меня есть это решение. Просто укажите путь к исходному файлу 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

Edit: метод переписан, чтобы сделать его более четким.