Какой самый короткий способ импортировать модуль из удаленного, относительного каталога?Импорт модулей Python из удаленного каталога
Мы использовали этот код, который не так уж плох, за исключением вашего текущего рабочего каталога имеет, чтобы он был таким же, как в каталоге, где этот код или относительные разрывы пути, которые могут быть подвержены ошибкам и запутывать пользователей ,
import sys
sys.path.append('../../../Path/To/Shared/Code')
Этот код (я думаю) исправляет эту проблему, но гораздо больше подходит для ввода.
import os,sys
sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '../../../Path/To/Shared/Code')))
Есть ли более короткий способ добавления абсолютного пути? Краткость имеет значение, потому что это должно быть напечатано/появилось во многих наших файлах. (Мы не можем это исключить, потому что тогда это было бы в общем коде, и мы не смогли бы добраться до него. Курица & яйцо, самозарядка и т. Д.)
Плюс это беспокоит меня, что мы слепо добавляем в sys .path, но это будет еще больше кода. Я уверен, что что-то в стандартной библиотеке могло бы помочь в этом.
Это обычно появляется в файлах сценариев, которые запускаются из командной строки. Мы запускаем Python 2.6.2.
Edit: Причина мы используем относительные пути, что мы, как правило, имеют несколько независимых копий кодовую на наших компьютерах. Важно, чтобы каждая копия кодовой базы использовала собственную копию общего кода. Поэтому любое решение, которое поддерживает только одну базу кода (например, «Поместить его в пакеты сайта»), не будет работать для нас.
Любые предложения? Спасибо!
Он не устраняет требования, что рабочий каталог должен быть конкретным, хотя ... Хотя это не кажется большой проблемой. Но я должен сказать, что эта ситуация просто кричит buildout/virtualenv мне. –
@ Lennart, у меня была глупая опечатка, не использующая аргумент 'apath' в' relative_dir' - исправлена это сейчас, и вы увидите, что нет никакого требования, чтобы рабочий каталог был чем-то особенным - передан '__file__' to 'addpack' - это то, где живет вызывающий модуль, нечего делать с текущим рабочим каталогом. Конечно, возможны и расширенные подходы, такие как «virtualenv», но это не столько о _development_, сколько о нескольких отключенных _deployments_ (на той же машине без разработки), если я правильно прочитал вопрос. –
Ну, я должен сказать, что я считаю, что использование virtualenv проще, чем это, так что продвинутый - это вопрос вкуса, я думаю. ;) Я не вижу причин не использовать virtualenv или buildout для развертываний. Напротив, развертывания - это то, что сделано для создания. –