Есть ли больше путей поиска, чем в sys.path? - PullRequest
5 голосов
/ 14 июля 2011

Я думал, что sys.path - это полный список всех путей поиска для модулей Python.

Однако на моем компьютере с Ubuntu '/ usr / local / lib / python2.6 / dist-packages / '- это место, где находятся почти все мои модули, и этот путь отсутствует в sys.path.И я все еще могу импортировать любой модуль по этому пути.

РЕДАКТИРОВАТЬ, НЕ ИСТИНА: Даже если я установлю sys.path в пустой список, я все равно смогу импортировать с этого пути.

Откуда это неявное знание пути dist-packages?И есть ли другие пути в этой неявной группе путей поиска или что-то еще?

РЕДАКТИРОВАТЬ: Кажется, что вторая часть моего сообщения не соответствует действительности.Действительно, «sys.path = []» будет означать, что я не могу импортировать что-либо, даже из моего текущего рабочего каталога.Мои извенения.

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

Обратите внимание на упоминание зависимого от установки значения по умолчанию в после :

6.1.2.Путь поиска модуля

Когда импортируется модуль с именем spam, интерпретатор ищет файл с именем spam.py в каталоге, содержащем входной скрипт, а затем в списке каталогов, заданных параметромпеременная окружения PYTHONPATH.Он имеет тот же синтаксис, что и переменная оболочки PATH, то есть список имен каталогов.Если PYTHONPATH не задано или файл там не найден, поиск продолжается по пути установки по умолчанию ;в Unix это обычно .:/usr/local/lib/python.

На самом деле, модули ищутся в списке каталогов, заданном переменной sys.path, которая инициализируется из каталога, содержащего входной скрипт (или текущий каталог),PYTHONPATH и зависящее от установки значение по умолчанию .Это позволяет программам Python, которые знают, что они делают, изменить или заменить путь поиска модуля.Обратите внимание, что, поскольку каталог, содержащий выполняемый скрипт, находится в пути поиска, важно, чтобы у скрипта не было того же имени, что и у стандартного модуля, или Python попытается загрузить скрипт как модуль при импорте этого модуля.Это обычно будет ошибкой.См. Раздел Стандартные модули для получения дополнительной информации.

edit На моем Ubuntu поле /usr/local/lib/python2.6/dist-packages присутствует в sys.path.Если я очищаю sys.path и затем пытаюсь импортировать модуль из вышеуказанного каталога, он больше не работает.Это говорит о том, что переводчик не имеет неявных знаний об этом каталоге и находит его с помощью sys.path.

edit Когда вы проводите свои эксперименты, убедитесь, что вы изменили sys.path прямо наначало вашей сессии Python.Если вы import X, затем очистите sys.path, а затем import X снова, последний не выйдет из строя, даже если X больше не включен sys.path.

1 голос
/ 14 июля 2011

Путь поиска модуля

Фактически, поиск модулей выполняется в списке каталогов, заданном переменной sys.path, которая инициализируется из каталога, содержащего входной скрипт (илитекущий каталог), PYTHONPATH и зависящее от установки значение по умолчанию.

Вы работаете в зависящее от установки значение по умолчанию.

Дополнительная информация о зависимых от установки путях поиска

...