2009-06-19 2 views
7

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

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

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

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

Если у меня

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

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

Благодаря

+4

Пожалуйста, разместите код, показывающий, как вы добавляете пути. –

ответ

2

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

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

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

17

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

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

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

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

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

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

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

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

, который даст вам

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

Но это все догадки, пока не разместим ваш код.

4

Пример обновления sys.path взяты из here

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

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

1

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

Например, у меня есть модуль под названием Foo, который содержит модуль, который называется баром, который был разделен на несколько каталогов:

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 
Смежные вопросы