Python sys.path модификация не работает - PullRequest
8 голосов
/ 19 июня 2009

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

Некоторые фрагменты кода: Если я сделаю </p> <pre> pathtoInsert1 = " .... " pathtoInsert2 = " .... " sys.path.insert(0, pathToInsert1) sys.path.insert(0, pathToInsert2) </pre> <p> это не работает. Не учитывает пути.

Если я сделаю </p> <pre> pathList = [pathToInsert1, pathToInsert2] sys.path = pathList </pre> <p> это работает.

Спасибо

Ответы [ 4 ]

18 голосов
/ 19 июня 2009

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

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

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

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

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

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

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

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

что даст вам

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

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

4 голосов
/ 26 августа 2009

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

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

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

2 голосов
/ 01 марта 2013

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

Например, у меня есть модуль с именем 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 я уже импортировал базуи 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
2 голосов
/ 19 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...