Как временно изменить sys.path в Python?

В одном из моих тестовых скриптов в Python я использую этот шаблон несколько раз:

sys.path.insert(0, "somedir")
mod =  __import__(mymod)
sys.path.pop(0)

Есть ли более краткий способ временного изменения пути поиска?

Ответы

Ответ 1

Вы можете использовать простой контекстный менеджер:

import sys

class add_path():
    def __init__(self, path):
        self.path = path

    def __enter__(self):
        sys.path.insert(0, self.path)

    def __exit__(self, exc_type, exc_value, traceback):
        sys.path.remove(self.path)

Затем для импорта модуля вы можете:

with add_path("/path/to/dir"):
    mod = __import__("mymodule")

При выходе из тела оператора with sys.path будет восстановлено исходное состояние. Если вы используете только модуль внутри этого блока, вы также можете удалить его ссылку из sys.modules:

del sys.modules["mymodule"]

Ответ 2

Добавление значения в sys.path только временно изменяет его, т.е. только для этого сеанса.

Постоянные изменения производятся путем изменения PYTHONPATH и каталога установки по умолчанию.

Итак, если по-временному вы предназначались только для текущего сеанса, тогда ваш подход в порядке, но вы можете удалить часть pop, если somedir не скрывает какие-либо важные модули, которые, как ожидается, будут найдены в PYTHONPATH, текущий каталог или каталог установки по умолчанию.

http://docs.python.org/2/tutorial/modules.html#the-module-search-path