Математический анализ. 3е издание
Скачать 4.86 Mb.
|
Верхний уровень: главный файл программы a.py b.py c.py Модули стандартной библиотеки Модули Рис. 18.1. Архитектура программы на языке Python. Программа – это система модулей. Она состоит из одного главного файла сценария (который требуется запустить, чтобы начать работу программы) и нескольких модулей (импортируемых библиотек инструментальных средств). И сценарии, и модули – это текстовые файлы, содержащие инструкции на языке Python, хотя инструкции в модулях обычно только создают объекты для последующего использования. Стандартная библиотека языка Python представляет собой коллекцию модулей, готовых к использованию Архитектура программы на языке Python 489 В языке Python невозможно обращаться к именам в других модулях, пока такие инструкции импорта не будут выполнены на этапе времени выполнения. Основная задача этих инструкций состоит в том, чтобы связать имена в модуле – простые переменные – с объектами загру женных модулей. Фактически, имя модуля, используемое в инструк ции import, вопервых, идентифицирует внешний файл и, вовторых, становится именем переменной, которая будет представлять загру женный модуль. Объекты, определяемые модулем, также создаются во время выполнения, когда производится импорт модуля: инструк ция import, в действительности, последовательно выполняет инструк ции в указанном файле, чтобы воссоздать его содержимое. Вторая инструкция в файле a.py вызывает функцию spam, определен ную в модуле b, используя форму записи атрибутов объекта. Запись b.spam означает следующее: «извлечь значение имени spam, располо женного в объекте b». В нашем примере – это вызываемая функция, поэтому далее ей передается строка в круглых скобках ('gumby'). Если вы создадите эти файлы, сохраните их и запустите файл a.py, то будут выведены слова «gumby spam». Вы увидите, что повсюду в сценариях на языке Python используется нотация object.attribute – большинство объектов обладают атрибута ми, доступ к которым можно получить с помощью оператора «.». Не которые атрибуты – имена вызываемых функций, а другие – простые значения, которые представляют свойства объекта (например, имя персоны). Импорт – широко используемое понятие в языке Python. Любой файл может импортировать функциональные возможности из любого дру гого файла. Например, файл a.py может импортировать файл b.py, что бы иметь возможность вызывать его функцию, при этом файл b.py мо жет в свою очередь импортировать файл c.py, чтобы получить доступ к другим функциональным возможностям, определенным в нем. Це почка импортирования может уходить так глубоко, как это потребует ся: в этом примере модуль a может импортировать модуль b, который импортирует модуль c, который в свою очередь может еще раз импор тировать модуль b, и т. д. Помимо самой крупной единицы в организационной структуре про граммы модули (и пакеты модулей, которые описываются в главе 20) также играют роль самой крупной единицы программного кода, дос тупного для повторного использования. Оформив программные ком поненты в виде файлов модулей, вы сможете использовать их не толь ко в оригинальной программе, но и в любых других программах, кото рые вам придется писать. Например, если после написания програм мы, структура которой изображена на рис. 18.1, вдруг обнаружится, что функция b.spam является универсальным инструментом, мы смо жем использовать ее в других программах. Все, что нам потребуется, – это импортировать файл b.py из файлов другой программы. 490 Глава 18. Модули: общая картина Модули стандартной библиотеки Обратите внимание на правую часть рис. 18.1. Некоторые из модулей, которые будут импортироваться вашими программами, входят непо средственно в состав языка Python, и вам не придется писать их. Интерпретатор Python поставляется с обширной коллекцией дополни тельных модулей, которая известна как стандартная библиотека. Эта коллекция насчитывает порядка 200 крупных модулей и содер жит платформонезависимую поддержку распространенных задач про граммирования: интерфейсы операционных систем, организацию хра нилищ объектов, поиск по шаблону, сетевые взаимодействия, созда ние графического интерфейса и многих других. Ни один из этих инст рументов не является непосредственной частью языка Python, но вы можете использовать их, импортируя соответствующие модули. Так как это модули стандартной библиотеки, можно быть уверенным, что они будут доступны и будут работать переносимым образом на боль шинстве платформ, на которых работает интерпретатор Python. В примерах этой книги вы увидите несколько модулей стандартной библиотеки в действии, но за полной информацией вам следует обра титься к справочным руководствам по стандартной библиотеке языка Python, которые можно найти в инсталляции Python (в IDLE или в ме ню кнопки Пуск (Start) в операционной системе Windows) или в Интер нете, по адресу: http://www.python.org. При таком большом количестве модулей это действительно единствен ный способ получить представление о том, какие инструментальные средства имеются в наличии. Кроме этого, описание библиотеки инст рументов Python можно найти в некоторых книгах, посвященных прикладному программированию, таких как «Programming Python», но, в отличие от книг, руководства распространяются бесплатно, их можно просматривать в любом вебброузере (поскольку они распро страняются в формате HTML) и к тому же они обновляются с выходом каждой новой версии Python. Как работает импорт В предыдущем разделе говорилось об импортировании модулей, но ни как не объяснялось, что происходит во время импорта. Так как в язы ке Python инструкции импортирования составляют основу структуры программы, здесь мы подробнее рассмотрим этот вопрос, чтобы сде лать представление о процессе импорта менее абстрактным. Некоторые программисты на языке C любят сравнивать инструкцию import в языке Python с инструкцией #include, но они в корне неправы – импортирование в языке Python – это не просто включение текста од ного файла в другой. Это самые настоящие операции времени выпол нения, которые выполняют следующие действия, когда программа впервые импортирует заданный файл: Как работает импорт 491 1. Отыскивают файл модуля. 2. Компилируют в байткод (если это необходимо). 3. Запускают программный код модуля, чтобы создать объекты, ко торые он определяет. Чтобы лучше понять, как протекает импорт модулей, мы исследуем все эти действия по порядку. Примите во внимание, что все три дейст вия выполняются, только когда модуль впервые импортируется во время выполнения программы – все последующие операции импорта того же модуля пропускают эти действия и просто выбирают уже нахо дящийся в памяти объект модуля. 1. Поиск Прежде всего, интерпретатор должен определить местонахождение файла модуля, указанного в инструкции import. Обратите внимание, что имена файлов в инструкции import в примерах из предыдущих раз делов указаны без расширения .py и без пути к каталогу: вместо записи в виде, например, import c:\dir1\b.py инструкция записывается просто – import b . Фактически, допускается указывать лишь простые имена – путь к каталогу и расширение файла должны быть опущены, потому что для поиска файла, соответствующего имени, указанному в инст рукции import, интерпретатор использует стандартный путь поиска модулей 1 Поскольку это основная часть операции импорта, которую необходимо знать программистам, мы рассмотрим ее более подробно. Путь поиска модулей В большинстве случаев можно положиться на автоматически организо ванные пути поиска модулей и вообще не настраивать этот путь. Одна ко, если вам потребуется импортировать модули из пользовательских каталогов, вам необходимо будет знать, как работает путь поиска фай лов, чтобы настроить его соответствующим образом. В общих чертах пути поиска модулей в языке Python выбираются из объединенных 1 В действительности синтаксис стандартной инструкции import не позволяет включать путь к файлу и его расширение. Для операции импортирования пакетов , которая будет рассматриваться в главе 20, инструкция import до пускает указывать путь к файлу в виде последовательности имен, разделен ных точкой; но при этом операция импортирования пакетов попрежнему использует обычный путь поиска модулей, чтобы отыскать самый первый каталог в указанном пути к пакету (то есть пути к пакетам указываются от носительно одного из каталогов, находящегося в пути поиска). Кроме того, эта операция не позволяет использовать в инструкции import синтаксис пу тей к каталогам, характерный для определенной платформы, – этот синтак сис может использоваться только при определении самого пути поиска. Сле дует также заметить, что проблемы поиска пути к файлам модулей отсутст вуют при запуске фиксированных двоичных файлов (рассматривались в гла ве 2); они обычно содержат в двоичном образе весь необходимый байткод. 492 Глава 18. Модули: общая картина данных следующих основных источников. Некоторые из них предо пределены, а некоторые можно настроить и тем самым сообщить ин терпретатору, где выполнять поиск: 1. Домашний каталог программы. 2. Содержимое переменной окружения PYTHONPATH (если таковая опре делена). 3. Каталоги стандартной библиотеки. 4. Содержимое любых файлов с расширением .pht (если таковые име ются). В конечном итоге объединение этих четырех компонентов составляет sys.path – список строк с именами каталогов, о котором я расскажу подробнее в следующем разделе. Первый и третий компоненты пути поиска определяются автоматически, но, так как интерпретатор при поиске использует данные всех этих компонентов, от первого до по следнего, то второй и четвертый компоненты можно использовать для расширения пути поиска, включая в него свои собственные каталоги с исходными текстами. Далее описывается, как интерпретатор Python использует эти компоненты пути: Домашний каталог В первую очередь интерпретатор ищет импортируемые файлы в до машнем каталоге. В зависимости от того, как была запущена про грамма, это будет либо каталог, где находится главный файл про граммы, либо каталог, из которого вы работаете в интерактивной оболочке. Поскольку поиск в первую очередь производится в этом каталоге, если программа целиком располагается в одном каталоге, все операции импорта будут выполнены автоматически, без необхо димости настраивать путь поиска. Каталоги в PYTHONPATH После этого поиск производится во всех каталогах, перечисленных в переменной окружения PYTHONPATH, слева направо (если эта пере менная вообще установлена). В двух словах, переменная окруже ния PYTHONPATH – это просто список имен каталогов, определяемых пользователем и системой, в которых располагаются файлы с про граммным кодом на языке Python. Вы можете добавить в эту пере менную все каталоги, откуда предполагается импортировать моду ли, и интерпретатор будет использовать ваши настройки при созда нии пути поиска модулей. Поскольку интерпретатор пытается отыскать файлы сначала в до машнем каталоге, настройка этой переменной приобретает большое значение, только когда необходимо импортировать модули, разме щающиеся в разных каталогах, – то есть когда импортируемый файл хранится в каталоге, отличном от каталога, где располагается импортирующий файл. Вам наверняка потребуется настраивать пе ременную окружения PYTHONPATH, как только вы начнете писать Как работает импорт 493 большие программы, но на начальном этапе освоения языка храни те файлы всех своих модулей в каталоге, в котором вы работаете (то есть в домашнем каталоге), и тогда операции импорта будут рабо тать без необходимости выполнять какиелибо настройки. Каталоги стандартной библиотеки Далее интерпретатор автоматически выполняет поиск в каталогах, куда были установлены модули стандартной библиотеки. Так как эти каталоги всегда участвуют в поиске, их можно не добавлять в пе ременную окружения PYTHONPATH. Каталоги в файле .pth Наконец, относительно новая особенность языка Python дает поль зователям возможность добавлять нужные каталоги в путь поиска модулей, просто перечисляя их по одному в строке в текстовом фай ле, имя которого оканчивается расширением .pth (от слова «path» – «путь»). Эти файлы представляют собой расширенную возмож ность, имеющую отношение к проблеме установки, и мы не будем здесь подробно их обсуждать. Текстовый файл со списком каталогов помещается в соответствую щий каталог и может играть примерно ту же роль, что и перемен ная окружения PYTHONPATH. Например, для расширения пути поиска модулей файл с именем myconfig.pth можно поместить в главный каталог, куда был установлен Python в Windows (например, C:\Py+ thon25 или C:\Python25\Lib\sitepackages). Интерпретатор добавит в конец пути поиска модулей каталоги, перечисленные во всех строках файла, от первой до последней. Поскольку это файлы, а не параметры настройки командной оболочки, они могут применять ся ко всем пользователям системы, а не только к одному пользова телю или одной командной оболочке. Эта особенность на практике более сложная, чем я описал. За до полнительной информацией обращайтесь к руководству по библио теке языка Python (в частности, к описанию модуля site, входяще го в стандартную библиотеку). Начинающим я рекомендую исполь зовать переменную окружения PYTHONPATH или единственный файл .pth и только в том случае, если возникает необходимость импорти ровать файлы из других каталогов. В приложении A вы найдете примеры наиболее распространенных способов расширения пути поиска файлов с помощью переменной окружения PYTHONPATH или файлов .pth на различных платформах. Это описание пути поиска модулей является верным, но достаточно об щим, – точная конфигурация пути поиска зависит от типа платформы и версии Python. В зависимости от используемой платформы в путь поиска модулей могут добавляться дополнительные каталоги. Например, в путь поиска вслед за каталогами из переменной окруже ния PYTHONPATH и перед каталогами стандартной библиотеки, интерпре татор может добавлять текущий рабочий каталог – каталог, откуда 494 Глава 18. Модули: общая картина была запущена программа. Когда программа запускается из команд ной строки, текущий рабочий каталог может не совпадать с домашним каталогом, где находится главный файл программы (то есть с катало гом, где находится программа). 1 Так как от запуска к запуску програм мы текущий рабочий каталог может изменяться, при обычных услови ях рабочий каталог не должен иметь значения для операций импорта. 2 Список sys.path Если вам потребуется узнать, как выглядит путь поиска на вашей ма шине, вы всегда сможете сделать это, просмотрев содержимое встроен ного списка sys.path (то есть содержимое атрибута path модуля sys, входящего в состав стандартной библиотеки). Этот список строк с име нами каталогов представляет собой фактический путь поиска, исполь зуемый интерпретатором, – при выполнении операций импорта Py thon просматривает каждый каталог из списка, слева направо. Действительно, sys.path – это путь поиска модулей. Интерпретатор создает его во время запуска программы, автоматически объединяя в список все каталоги, перечисленные в переменной окружения PYTHON PATH и в файлах .pth, и добавляя в начало списка домашний каталог главного файла программы (возможно как пустую строку). Представление языком Python этого списка имеет два основных полез ных результата. Вопервых, он обеспечивает возможность проверить настройки пути поиска, которые вы выполнили, – если вы не видите свои настройки в этом списке каталогов, вам следует проверить, на сколько правильно вы все проделали. Вовторых, если вы понимаете, как формируется список, вы можете обеспечить сценариям возмож ность самостоятельно задавать свои пути поиска. Как будет показано далее в этой части книги, изменяя список sys.path, вы можете изме нить путь поиска для всех последующих операций импорта. Однако эти изменения продолжают действовать, только пока выполняется сценарий; переменная окружения PYTHONPATH и файлы .pth обеспечива ют возможность более долговременного хранения измененного пути. 3 1 Подробнее о запуске программ из командной строки говорится в главе 3. 2 В главе 21 дополнительно обсуждается относительно новый синтаксис инструкции импортирования , добавленный в версии Python 2.5, – благода ря ему можно изменять путь поиска в инструкции from с помощью симво лов «.» (например, from . import string). 3 Некоторым программам действительно требуется изменять sys.path. Сце нарии, которые выполняются на вебсервере, например, обычно выполня ются с привилегиями пользователя «nobody» с целью ограничить доступ к системе. Поскольку такие сценарии обычно не должны зависеть от значе ния переменной окружения PYTHONPATH для пользователя «nobody», они час то изменяют список sys.path вручную, чтобы включить в него необходимые каталоги до того, как будет выполнена какаялибо инструкция import. Обычно для этого бывает достаточно вызова sys.path.append(dirname). Как работает импорт 495 Выбор файла модуля Имейте в виду, что расширения имен файлов (например, .py) предна меренно опущены в инструкции import. Интерпретатор выбирает пер вый найденный в пути поиска файл, который соответствует указанно му имени. Например, инструкция import b могла бы загрузить: • Файл с исходным текстом, имеющий имя b.py. |