2012-04-15 2 views
44

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

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

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

Ближайший я мог бы получить был

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

Который дал мне разрешение Отказано на окнах 7.

+0

Также стоит проверить этот [родственный вопрос] (http://stackoverflow.com/questions/15109548/set-pythonpath-before-import-statements). В частности, мне нравится [верхний ответ] (http://stackoverflow.com/a/15109660/95852), для его ясности о безопасности изменений в 'sys.path'. –

+0

Возможный дубликат [Как импортировать модуль с полным путем?] (Http://stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path) –

ответ

62

Одним из способов является просто изменить свой path:

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

Обратите внимание, что это требует Foo быть пакет питона, т.е. содержать __init__.py файл. Если вы не хотите изменять sys.path, вы можете also modify the PYTHONPATH environment variable или install the module on your system. Помните, что это означает, что другие каталоги или файлы .py в этом каталоге могут быть загружены непреднамеренно.

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

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

Он работает, но теперь, пытаясь использовать util.method с помощью метода, он говорит, что «метод» не определен. Но я могу использовать его методом util.method. Зачем? – Vort3x

+2

Поскольку вы не определили 'метод', только« метод »в' util'. Вы можете определить 'метод = util.method', если хотите. – katrielalex

+0

Обратите внимание, что 'from foo import *' - это плохое кодирование, если вы не просто взламываете оболочку. – katrielalex

5

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

См. Module Search Path документация на python.org.

2

Дайте это попробовать

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

-1 Поскольку добавление к пути Python является плохим решением. Он работает, но это хуже, чем imp.load_source, потому что пользователь может не захотеть изменять какие-либо системные пути или может работать на компьютере, где он или она не может этого сделать. Это на самом деле одна из самых раздражающих «функций» в Python, которая в противном случае является изящным языком. Глупо, что вы не можете просто импортировать строку, набирая путь к другому .py-файлу.И учитывая, что вы не можете, защита от изменения системных путей с помощью imp строго лучше. – ely

+1

@EMS Ах .. Я понимаю, о чем вы говорите, я этого раньше не осознавал, но теперь то, что вы делаете, ясно. Спасибо за указание на это. (Возможно, мне придется изменить некоторые из моих собственных кодов :) – Levon

+3

Не волнуйся. Это назначенная цель 'sys.path' (или, по крайней мере, * * предполагаемый прецедент). Г-н F (который, по-видимому, ранее был EMS) ошибочен. Как отмечает фигаг в своем ответе на идентичный -1 комментарий к его ответу, 'sys.path' * не *, связанный с общим системным путем. –

1

Этот наконечник 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 

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

Смежные вопросы