Модификация Python sys.path не работает

Я пытаюсь изменить sys.path в одном из моих файлов Python, чтобы иметь некоторые каталоги конкретных библиотек в пути поиска модулей (это может быть не лучший способ, но...). Если я вставлю несколько путей перед sys.path, мой сценарий не будет учитывать эти пути для будущего импорта. Если я создам совершенно новый список, содержащий те каталоги библиотек, которые мне нужны, и назначу этот список sys.path, тогда этот импорт будет принят во внимание. Это правильное поведение? Я использую питон 2.5.4. Могло ли это быть что-то из моего окружения, что могло привести к такому поведению?

Некоторые фрагменты кода: Если я сделаю

pathtoInsert1 = " .... "
pathtoInsert2 = " .... "
sys.path.insert(0, pathToInsert1)
sys.path.insert(0, pathToInsert2)

, это не сработает. Он не учитывает пути.

Если я сделаю

pathList = [pathToInsert1, pathToInsert2] 
sys.path = pathList

, это сработает.

Спасибо


person celavek    schedule 19.06.2009    source источник
comment
Пожалуйста, опубликуйте код, показывающий, как вы добавляете пути.   -  person Daniel Roseman    schedule 19.06.2009
comment
Я чувствую, что за последние 10 лет импортное оборудование могло достаточно измениться, чтобы эта проблема больше не возникала или, по крайней мере, решалась бы по-другому.   -  person pcurry    schedule 05.06.2019


Ответы (4)


Вам действительно нужно опубликовать код, чтобы мы могли вам помочь. Тем не менее, я могу сделать обоснованное предположение. Вы говорите, что если вы создадите совершенно новый список и назначите его sys.path, тогда он сработает. Я предполагаю, что вы имеете в виду, что делаете что-то вроде этого

sys.path = ["dir1", "dir2", ...]

Но если вставить пути в начале, то это не сработает. Я предполагаю, что вы используете метод вставки, например

sys.path.insert(0, ["dir1", "dir2"])

Если это так, то это неправильно. Это создаст список, который выглядит как

[["dir1", "dir2"], "dir3", ...]

Вместо этого вы должны сказать

sys.path[:0] = ["dir1", "dir2"]

что даст тебе

["dir1", "dir2", "dir3", ...]

Но это все догадки, пока вы не опубликуете свой код.

person Eli Courtwright    schedule 19.06.2009

Пример обновления sys.path взят из здесь

import sys
sys.path.append("/home/me/mypy")

Это сработало для меня.

person bentford    schedule 26.08.2009

Как вы «вставляете» дополнительные пути?

Изменение пути выполняется так же, как и любой другой список в Python, хотя это звучит так, как будто вы просто затираете его, переназначая его.

Пример обновления sys.path: http://www.johnny-lin.com/cdat_tips/tips_pylang/path.html

person Jon    schedule 19.06.2009

У меня просто была похожая проблема при работе в iPython с модулями, которые распределены по нескольким каталогам. В этом случае, чтобы заставить импорт работать, необходимо убедиться, что module.__path__ модулей с распределенными __init__.py включает все каталоги, где находится один из модулей __init__.py, а также убедиться, что правильный каталог находится в списке sys.path.

Например, у меня есть модуль foo, который содержит модуль bar, распределенный по нескольким каталогам:

aerith/foo/bar/__init__.py
aerith/foo/bar/baz/__init__.py
bob/foo/bar/__init__.py
bob/foo/bar/baf/__init__.py
carol/foo/bar/__init__.py
carol/foo/bar/quux/__init__.py

В iPython я уже импортировал baz и baf и хотел импортировать quux.

from foo.bar import quux

Это дало ImportError, потому что carol не было в sys.path, а sys.path.append('carol') не исправило ImportError.

Требовалось сообщить модулю bar, что один из его __init__.py можно найти в 'carol/foo/bar'.

foo.bar.__path__.append('carol/foo/bar')
from foo.bar import quux
person pcurry    schedule 01.03.2013