Лутц М. - Изучаем Python (1077325), страница 105
Текст из файла (страница 105)
Фактически, допускается указывать лишь простые имена— путь к каталогу и расширение Файла должны быть опущены, потому что для поиска файла, соответствующего имени, указанному в инструкции (зрогт, интерпретатор использует стандартный лулть поиска модулей.' Поскольку это основная часть операции импорта, которую необходимо знать программистам, мы рассмотрим ее более подробно.
Путь поиска модулей В большинстве случаев можно положиться на автоматически организованные пути поиска модулей и вообще не настраивать этот путь. Однако, если вам потребуется импортировать модули из пользовательских каталогов, вам необходимо будет знать, как работает путь поиска Файлов, чтобы настроить его соответствующим образом. В общих чертах пути поиска модулей в языке Рустов выбираются из объединенных В действительности синтаксис стацаартной инструкции зеро гт не позволяет включать путь к файлу н его расширение. Длн операции имнортпированин накентов, которая будет рассматриваться в главе 20, инструкция тврогт допускает указывать путь к файлу в виде последовательности имен, разделенных точкой; но при этом операция импортирования пакетов по-прежнему использует обычный путь поиска модулей, чтобы отыскать самый первый каталог в указанном пути к пакету (то есть пути к пакетам указываются относительно одного из каталогов, находящегося в пути поиска).
Кроме того, зта операция не позволяет использовать в инструкции тзрогт синтаксис путей к каталогам, характерный для определенной платформы, — этот синтаксис может использоваться только при определении самого пути поиска. Следует также заметить, что проблемы поиска пути к файлам модулей отсутствуют прн запуске фиксированных двоичных файлов (рассматривалнсь в главее 2); онн обычно содержат в двоичном образе весь необходимый байт-код.
Глава 18. Модули; общая картина данных следующих основных источников. Некоторые из них предопределены, а некоторые можно настроить и тем самым сообщить интерпретатору, где выполнять поиск: 1. Домашний каталог программы. 2. Содержимое переменной окружения РУТНОИРАТН (если таковая определена).
3. Каталоги стандартной библиотеки. 4. Содержимое любых файлов с расширением .рлг (если таковые имеются). В конечном итоге объединение этих четырех компонентов составляет вув. ратя — список строк с именами каталогов, о котором я расскажу подробнее в следующем разделе. Первый и третий компоненты пути поиска определяются автоматически, но, так как интерпретатор при поиске использует данные всех этих компонентов, от первого до последнего, то второй и четвертый компоненты можно использовать для расширения пути поиска, включая в него свои собственные каталоги с исходными текстами.
Далее описывается, как интерпретатор Рубанов использует эти компоненты пути: Домашний каталог В первую очередь интерпретатор ищет импортируемые файлы в домашнем каталоге. В зависимости от того, как была запущена программа, это будет либо каталог, где находится главный файл программы, либо каталог, из которого вы работаете в интерактивной оболочке.
Поскольку поиск в первую очередь производится в этом каталоге, если программа целиком располагается в одном каталоге, все операции импорта будут выполнены автоматически, без необходимости настраивать путь поиска. Каталоги в РУТНОИРАТН После этого поиск производится во всех каталогах, перечисленных в переменной окружения РУТНОИРАТН, слева направо (если эта переменная вообще установлена). В двух словах, переменная окружения РУТНОИРАТН вЂ” это просто список имен каталогов, определяемых пользователем и системой, в которых располагаются файлы с программным кодом на языке Рув)юп. Вы можете добавить в эту переменную все каталоги, откуда предполагается импортировать модули, и интерпретатор будет использовать ваши настройки при создании пути поиска модулей.
Поскольку интерпретатор пытается отыскать файлы сначала в домашнем каталоге, настройка этой переменной приобретает большое значение, только когда необходимо импортировать модули, размещающиеся в разных каталогах, — то есть когда импортируемый файл хранится в каталоге, отличном от каталога, где располагается импортирующий файл. Вам наверняка потребуется настраивать переменную окружения РУТНОИРАТН, как только вы начнете писать Как работает импорт 493 большие программы, но на начальном этапе освоения языка храните файлы всех своих модулей в каталоге, в котором вы работаете (то есть в домашнем каталоге), и тогда операции импорта будут работать без необходимости выполнять какие-либо настройки.
Каталоги стандартной библиотеки Далее интерпретатор автоматически выполняет поиск в каталогах, куда были установлены модули стандартной библиотеки. Так как эти каталоги всегда участвуют в поиске, их можно не добавлять в переменную окружения РУТНОНРАТН. Каталоги в Файле .ргЬ Наконец, относительно новая особенность языка Ругйоп дает пользователям возможность добавлять нужные каталоги в путь поиска модулей, просто перечисляя их по одному в строке в текстовом файле, имя которого оканчивается расширением .ргЬ (от слова «ра1)т»вЂ” «путь»). Эти файлы представляют собой расширенную возможность, имеющую отношение к проблеме установки, и мы не будем здесь подробно их обсуждать.
Текстовый файл со списком каталогов помещается в соответствующий каталог и может играть примерно ту же роль, что и переменная окружения РУТНОНРАТН. Например, для расширения пути поиска модулей файл с именем туганов(ур1Ь можно поместить в главный каталог, куда был установлен Рубанов в ТАЧпбо»чв (например, С:'~ругйоп25 или С:~ругйоп25~ИЬ\з(герасйауез).
Интерпретатор добавит в конец пути поиска модулей каталоги, перечисленные во всех строках файла, от первой до последней. Поскольку это файлы, а не параметры настройки командной оболочки, они могут применяться ко всем пользователям системы, а не только к одному пользователю или одной командной оболочке. Эта особенность на практике более сложная, чем я описал. За дополнительной информацией обращайтесь к руководству по библиотеке языка Ру»)топ (в частности, к описанию модуля з!ге, входящего в стандартную библиотеку). Начинающим я рекомендую использовать переменную окружения РУТНОНРАТН или единственный файл .ргЬ и только в том случае, если возникает необходимость импортировать файлы из других каталогов.
В приложении А вы найдете примеры наиболее распространенных способов расширения пути поиска файлов с помощью переменной окружения РУТНОНРАТН или файлов .ргЬ на различных платформах. Это описание пути поиска модулей является верным, но достаточно общим, — точная конфигурация пути поиска зависит от типа платформы и версии Ру1поп.
В зависимости от используемой платформы в путь поиска модулей могут добавляться дополнительные каталоги. Например, в путь поиска вслед за каталогами из переменной окружения РУТНОНРАТН и перед каталогами стандартной библиотеки, интерпретатор может добавлять текущий рабочий каталог — каталог, откуда 494 Глава 1В. Модули: общая картина была запущена программа. Когда программа запускается из командной строки, текущий рабочий каталог может не совпадать с домашним каталогом, где находится главный файл программы (то есть с каталогом, где находится программа).' Так как от запуска к запуску программы текущий рабочий каталог может изменяться, при обычных условиях рабочий каталог не должен иметь значения для операций импорта.' Список буй.раФ Если вам потребуется узнать, как выглядит путь поиска на вашей машине, вы всегда сможете сделать это, просмотрев содержимое встроенного списка эуз, рзтп (то есть содержимое атрибута ра1Ь модуля зуз, входящего в состав стандартной библиотеки).
Этот список строк с именами каталогов представляет собой фактический путь поиска, используемый интерпретатором, — при выполнении операций импорта Ру1Ьоп просматривает каждый каталог из списка, слева направо. Действительно, зуз,рзтл — это путь поиска модулей. Интерпретатор создает его во время запуска программы, автоматически объединяя в список все каталоги, перечисленные в переменной окружения РТТНОНРАТН и в файлах .р(Ь, и добавляя в начало списка домашний каталог главного файла программы (возможно как пустую строку). Представление языком РуФЬоп этого списка имеет два основных полезных результата.
Во-первых, он обеспечивает возможность проверить настройки пути поиска, которые вы выполнили, — если вы не видите свои настройки в этом списке каталогов, вам следует проверить, насколько правильно вы все проделали. Во-вторых, если вы понимаете, как формируется список, вы можете обеспечить сценариям возможность самостоятельно задавать свои пути поиска.
Как будет показано далее в этой части книги, изменяя список зуз. рзтя, вы можете изменить путь поиска для всех последующих операций импорта. Однако эти изменения продолжают действовать, только пока выполняется сценарий; переменная окружения РУТНОНРАТН и файлы .рта обеспечивают возможность более долговременного хранения измененного пути.' Подробнее о запуске программ нз командной строки говорится в главе 3. В главе 21 дополнительно обсуждается относительно новый синтаксис инструкции имлортирования, добавленный в версии РутЬол 2.5, — благодаря ему можно изменять путь поиска а инструкции Г гон с помощью символов «. » (напрнмер, тгоа .
тарогт ятг1пр). Некоторым программам действительно требуется изменять эуз. ратЬ. Сценарии, которые выполняются на веб-сервере, например, обычно выполняются с привилегиями пользователя «поЬог)у» с целью ограничить доступ к системе. Поскольку такие сценарии обычно не должны зависеть от значения переменной окружения РУТНОНРЯТН для пользователя «лоЬог»у», они часто изменяют список пуз, ратп вручную, чтобы включить в него необходимые каталоги до того, как будет выполнена какая-либо инструкция тарогт. Обычно для этого бывает достаточно вызова зуэ. Рата, аррепс(о»глазе). Как работает импорт 495 Выбор файла модуля Имейте в виду, что расширения имен файлов (например, .ру) преднамеренно опущены в инструкции 1ерогт.
Интерпретатор выбирает первый найденный в пути поиска файл, который соответствует указанному имени. Например, инструкция 1зрогт Ь могла бы загрузить: ° Файл с исходным текстом, имеющий имя Ь.ру. ° Файл с байт-кодом, имеющий имя Ь рус. ° Содержимое каталога Ь. при импортировании пакета (описывается в главе 20). ° Скомпилированный модуль расширения, как правило, написанный на языке С или С++ и динамически присоединенный при импорте (например, Ь.зо в 1 1пих и Ь.ЮИ или Ь.руд в Суятч1п и в т(т(пт)втуз).
° Скомпилированный встроенный модуль, написанный на языке С и статически скомпонованный с интерпретатором Ру()топ. ° Файл 21Р-архива с компонентом, который автоматически извлекается при импорте. ° Образ памяти для фиксированных двоичных исполняемых файлов. ° Класс дауа в версии Лу()топ. ° Компонент .НЕТ в версии 1гопРу1)топ.