справочник по Python. мм isbn 9785932861578 9 785932 861578
Скачать 4.21 Mb.
|
10 . Среда выполнения В этой главе описывается окружение, в котором выполняются программы на языке Python. Целью главы является описание поведения интерпрета- Python. Целью главы является описание поведения интерпрета- . Целью главы является описание поведения интерпрета- тора во время выполнения, включая запуск, настройку и завершение про- граммы. Параметры интерпретатора и окружение Существует множество параметров, управляющих поведением интерпре- татора во время выполнения и окружением. Параметры передаются интер- претатору с помощью командной строки, как показано ниже: python [ options] [-c cmd | filename | - ] [args] В табл. 10.1 приводится перечень наиболее часто используемых параме- тров командной строки: Таблица 10.1. Параметры командной строки, принимаемые интерпретатором Параметр Описание -3 Включить вывод предупреждений об использовании особенностей, которые были удалены или изменены в Python 3. -B Не создавать файлы с расширениями .pyc и .pyo инструкцией import -E Игнорировать переменные окружения. -h Вывести список всех доступных параметров командной строки. -i Перейти в интерактивный режим по завершении выполнения про- граммы. -m module Запустить библиотечный модуль module, как самостоятельную про- грамму. -O Включить режим оптимизации. Параметры интерпретатора и окружение 227 Параметр Описание -OO Включить режим оптимизации и дополнительно удалить строки документирования при создании файла .pyo. -Q arg Определить поведение оператора деления в версии Python 2. Аргу- мент arg может быть одним из следующих: -Qold (по умолчанию), -Qnew , -Qwarn или -Qwarnall. -s Предотвратить возможность добавления пользователем новых ка- талогов в переменную sys.path. -S Не импортировать модуль site во время инициализации. -t Вывести предупреждение в случае непоследовательного использо- вания символов табуляции. -tt Возбудить исключение TabError в случае непоследовательного ис- пользования символов табуляции. -u Отключить буферизацию для потоков stdout и stderr. -U Интерпретировать все строковые литералы как строки Юникода (только в Python 2). -v Включить режим вывода отладочной информации для инструкций import -V Вывести номер версии и выйти. -x Пропустить первую строку в исходной программе. -c cmd Выполнить строку cmd, как инструкцию. Параметр -i переводит интерпретатор в интерактивный режим сразу по за- вершении выполнения программы, что бывает очень удобно при отладке. Параметр -m запускает библиотечный модуль как сценарий, который вы- полняется под именем модуля __main__. Параметры -O и -OO включают ре- жим оптимизации скомпилированных файлов с байт-кодом; описываются в главе 8 «Модули, пакеты и дистрибутивы». Параметр -S пропускает на этапе инициализации импортирование модуля site, который описывается в разделе «Файлы с настройками местоположения библиотек». Параметры -t , -tt и -v позволяют получать дополнительные предупреждения и отла- дочную информацию. Параметр –x заставляет интерпретатор пропустить первую строку программы и может использоваться в случае, когда эта строка не является допустимой инструкцией языка Python (например, ког- Python (например, ког- (например, ког- да первая строка в сценарии запускает интерпретатор Python). Имя программы указывается после всех параметров интерпретатора. Если имя не указано или вместо имени файла используется символ дефиса (-), интерпретатор будет читать текст программы со стандартного ввода. Если устройством стандартного ввода является интерактивный терминал, бу- дут выведены начальная информация и приглашение к вводу. В против- ном случае интерпретатор откроет указанный файл и будет выполнять ин- струкции в нем, пока не достигнет конца файла. Параметр -c cmd может использоваться для выполнения коротких программ в форме параметра командной строки, например: python –c “print(‘hello world’)”. 228 Глава 10. Среда выполнения Параметры командной строки, находящиеся после имени программы или после дефиса (-), передаются программе в переменной sys.argv, как описы- вается в разделе «Чтение параметров командной строки» в главе 9 «Ввод и вывод». Кроме того, интерпретатор читает значения переменных окружения, кото- рые перечислены в табл. 10.2: Таблица 10.2. Переменные окружения, используемые интерпретатором Переменная окружения Описание PYTHONPATH Список каталогов, разделенных двоеточием, образующий путь поиска модулей. PYTHONSTARTUP Файл, выполняемый при запуске интерпретатора в интерактивном режиме. PYTHONHOME Каталог установки Python. PYTHONINSPECT Имеет значение параметра –i. PYTHONUNBUFFERED Имеет значение параметра –u PYTHONIOENCODING Кодировка по умолчанию и политика обработки оши- бок при работе с потоками stdin, stdout и stderr. Значе- ние этой переменной – строка вида “encoding[:errors]”, например: “utf-8” или “utf-8:ignore”. PYTHONDONTWRITEBYTECODE Имеет значение параметра –B. PYTHONOPTIMIZE Имеет значение параметра –O. PYTHONNOUSERSITE Имеет значение параметра –s. PYTHONVERBOSE Имеет значение параметра –v. PYTHONUSERBASE Корневой каталог пользовательской библиотеки пакетов. PYTHONCASEOK Если определена, интерпретатор будет импортировать модули без учета регистра символов в их именах. Переменная PYTHONPATH определяет путь поиска модулей, добавляемый в на- чало списка sys.path, который описывается в главе 9. Переменная PYTHON- STARTUP определяет путь к файлу, который будет выполняться при запуске интерпретатора в интерактивном режиме. Переменная PYTHONHOME исполь- зуется, чтобы задать каталог установки Python, но она редко бывает нуж- Python, но она редко бывает нуж- , но она редко бывает нуж- на, так как интерпретатор знает, где находятся его библиотеки и каталог site-packages , куда обычно устанавливаются расширения. Если указан единственный каталог, например /usr/local, интерпретатор будет искать все файлы в этом каталоге. Если указано два каталога, например: /usr/ local:/usr/local/sparc-solaris-2.6 , интерпретатор будет искать платформо- независимые файлы в первом каталоге, а платформо-зависимые – во вто- ром. Переменная PYTHONHOME не оказывает никакого влияния, если выпол- няемый файл интерпретатора Python отсутствует в указанном каталоге. Переменная окружения PYTHONIOENCODING может представлять интерес для пользователей Python 3, потому что с ее помощью можно определить ко- Python 3, потому что с ее помощью можно определить ко- 3, потому что с ее помощью можно определить ко- Интерактивные сеансы 229 дировку и политику обработки ошибок при работе со стандартными пото- ками ввода-вывода. В некоторых случаях это может оказаться важным, потому что при работе в интерактивном режиме Python 3 напрямую выво- Python 3 напрямую выво- 3 напрямую выво- дит текст в Юникоде. Это может, в свою очередь, вызывать неожиданные исключения при простом исследовании данных. Например: >>> a = ‘Jalape\xf1o’ >>> a Traceback (most recent call last): File “ File “/tmp/lib/python3.0/io.py”, line 1486, in write b = encoder.encode(s) File “/tmp/lib/python3.0/encodings/ascii.py”, line 22, in encode return codecs.ascii_encode(input, self.errors)[0] UnicodeEncodeError: ‘ascii’ codec can’t encode character ‘\xf1’ in position 7: ordinal not in range(128) (Перевод: Трассировочная информация (самый последний вызов – самый нижний): Файл “ Файл “/tmp/lib/python3.0/encodings/ascii.py”, строка 22, в encode return codecs.ascii_encode(input, self.errors)[0] UnicodeEncodeError: невозможно преобразовать символ ‘\xf1’, в позиции 7, в кодировку ‘ascii’: порядковое значение за пределами range(128) ) >>> Чтобы исправить эту проблему, можно присвоить переменной окружения PYTHONIOENCODING значение, такое как ‘ascii:backslashreplace’ или ‘utf-8’. Ре- зультат будет следующим: >>> a = ‘Jalape\xf1o’ >>> a ‘Jalape\xf1o’ >>> В Windows значения некоторых переменных окружения, таких как PYTHON- PATH , дополняются значениями из записей в реестре, находящихся в ветке HKEY_LOCAL_MACHINE/Software/Python Интерактивные сеансы Если имя программы не указано и стандартный ввод интерпретатора свя- зан с интерактивным терминалом, Python запускается в интерактивном режиме. В этом режиме выводится начальное сообщение и приглашение к вводу. Кроме того, интерпретатор выполняет сценарий, путь к которому указан в переменной окружения PYTHONSTARTUP (если эта переменная уста- новлена). Этот сценарий выполняется, как если бы он был частью вводимой программы (то есть он не загружается с помощью инструкции import). Одно из назначений этого сценария может заключаться в том, чтобы прочитать пользовательский файл с настройками, такой как .pythonrc. После ввода строки пользователем интерпретатор может вывести следую- щее приглашение к вводу одного из двух видов. Приглашение >>> появля- 230 Глава 10. Среда выполнения е тся перед вводом новой инструкции; приглашение ... показывает, что про- должается ввод предыдущей инструкции. Например: >>> for i in range(0,4): ... print i, ... 0 1 2 3 >>> При желании имеется возможность изменить внешний вид приглашений, для чего достаточно изменить значения переменных sys.ps1 и sys.ps2. В некоторых системах интерпретатор Python может быть скомпонован с библиотекой GNU readline. Эта библиотека реализует возможность со- хранения истории команд, автозавершение и другие дополнения к инте- рактивному режиму Python. По умолчанию вывод от команд, выполняемых в интерактивном режиме, воспроизводится с помощью функции repr(). Однако в переменной sys.dis- .dis- dis- playhook можно указать другую функцию, ответственную за вывод резуль- татов. Ниже приводится пример усечения длинных результатов: >>> def my_display(x): ... r = repr(x) ... if len(r) > 40: print(r[:40]+”...”+r[-1]) ... else: print(r) >>> sys.displayhook = my_display >>> 3+4 7 >>> range(100000) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1...] >>> Наконец, полезно знать, что при работе в интерактивном режиме результат последней операции сохраняется в специальной переменной (_). Эта пере- менная может использоваться для получения промежуточных результатов в последовательностях операций. Например: >>> 7 + 3 10 >>> _ + 2 12 >>> Установка значения переменной _ происходит в функции displayhook(), по- казанной выше. Поэтому если вы переопределяете функцию displayhook(), ваша функция должна устанавливать значение переменной _, если, конеч- но, вы желаете сохранить эту функциональность. Запуск приложений на языке Python В большинстве случаев желательно, чтобы программы запускали интер- претатор автоматически, а не требовалось запускать его вручную. В UNIX этого можно добиться, если присвоить файлу с программой разрешение на Файлы с настройками местоположения библиотек 231 выполнение и указать в первой строке программы путь к интерпретатору, например: #!/usr/bin/env python # Python code from this point on... print “Привет, Мир!” ... В Windows двойной щелчок на файле с расширением .py, .pyw, .wpy, .pyc или .pyo автоматически будет запускать интерпретатор. Обычно программы запускаются в окне консоли, если они не имеют расширение .pyw (в этом случае программы запускаются как приложения с графическим интер- фейсом). Чтобы передать интерпретатору дополнительные параметры ко- мандной строки, можно запускать программу из файла .bat. Например, следующий файл .bat просто запускает сценарий на языке Python и пере- Python и пере- и пере- дает интерпретатору параметры, полученные файлом .bat из командной строки: :: foo.bat :: Запускает сценарий foo.py и передает интерпретатору :: полученные параметры командной строки c:\python26\python.exe c:\pythonscripts\foo.py %* Файлы с настройками местоположения библиотек Обычно в состав установки Python может входить множество сторонних модулей и пакетов. Чтобы настроить доступ к этим пакетам, интерпретатор сначала импортирует модуль site. Роль модуля site заключается в том, что- бы отыскать файлы пакетов и добавить дополнительные каталоги в путь поиска модулей sys.path. Кроме того, модуль site устанавливает кодировку по умолчанию, которая используется для преобразования строк Юникода. Модуль site сначала создает список имен каталогов, конструируя его из значений переменных sys.prefix и sys.exec_prefix, как показано ниже: [ sys.prefix, # Только для Windows sys.exec_prefix, # Только для Windows sys.prefix + ‘lib/ pythonvers/site-packages’, sys.prefix + ‘lib/site-python’, sys.exec_prefix + ‘lib/pythonvers/site-packages’, sys.exec_prefix + ‘lib/site-python’ ] Дополнительно, если разрешено, в этот список могут добавляться каталоги пакетов, определяемые пользователем (описываются в следующем разделе). Для каждого элемента в списке проверяется наличие указанного катало- га. Если каталог существует, он добавляется в переменную sys.path. Затем проверяется наличие каких-либо файлов с настройками пути поиска (фай- лов с расширением .pth). Файлы с настройками пути поиска могут содер- жать списки путей к каталогам, zip-файлам или к файлам с расширением .egg , относительно каталога, где находится файл с настройками, которые должны быть добавлены в sys.path. Например: 232 Глава 10. Среда выполнения # файл ‘foo.pth’ с настройками пакета foo foo bar Каждый каталог в файле с настройками пути поиска должен находиться в отдельной строке. Комментарии и пустые строки игнорируются. Когда модуль site загружает файл, он проверяет существование каждого катало- га. Если каталог существует, он добавляется в переменную sys.path. Повто- ряющиеся элементы добавляются только один раз. После того как все каталоги будут добавлены в sys.path, предпринимается попытка импортировать модуль sitecustomize. Цель этого модуля состоит в том, чтобы выполнить дополнительные настройки путей поиска. Если попытка импортировать модуль sitecustomize закончится исключением ImportError , эта ошибка просто игнорируется. Импортирование модуля sitecustomize производится перед добавлением пользовательских катало- гов в sys.path. Поэтому попытка поместить этот файл в каталог пользова- теля не даст желаемого эффекта. Кроме того, модуль site отвечает за настройку кодировки по умолчанию, используемой при преобразовании строк Юникода. Изначально выбира- выбира- выбира- ется кодировка ‘ascii’. Однако ее можно изменить, поместив в файл site- customize.py программный код, вызывающий функцию sys.setdefaultencod- .setdefaultencod- setdefaultencod- ing() с другой кодировкой, такой как ‘utf-8’. При желании можно изменить исходный текст модуля site так, чтобы он автоматически устанавливал ко- дировку, опираясь на системные настройки. Местоположение пользовательских пакетов Как правило, сторонние модули устанавливаются так, чтобы они были до- ступны всем пользователям. Однако пользователи могут создавать свои собственные каталоги для размещения модулей и пакетов. В системах UNIX и Macintosh эти каталоги обычно находятся в каталоге /.local и на- зываются примерно так: /.local/lib/python2.6/site-packages. В Windows местоположение этого каталога определяется по содержимому переменной окружения %APPDATA%, которая обычно имеет примерно такое значение: C:\ Documents and Settings\David Beazley\Application Data . Внутри этого катало- га можно найти подкаталог “Python\Python26\site-packages”. Если пользователь создает собственные модули и пакеты, которые он хотел бы использовать как библиотеки, эти модули можно поместить в каталог с библиотекой пользователя. Сторонние модули также можно установить в этот каталог, указав параметр --user при запуске сценария setup.py. На- пример: python setup.py install --user. Включение будущих особенностей Новые особенности языка, которые оказывают влияние на совместимость с более старыми версиями Python, в первых выпусках, где они представле- Python, в первых выпусках, где они представле- , в первых выпусках, где они представле- ны, обычно отключены. Включить эти особенности можно с помощью ин- струкции from __future__ import. Например: Включение будущих особенностей 233 # Включить новую семантику оператора деления from __future__ import division В случае использования эта инструкция должна быть первой инструкцией в модуле или в программе. Кроме того, область видимости особенностей, импортированных из __future__, ограничивается только областью видимо- сти модуля, в котором была использована эта инструкция. Поэтому импор- тированные особенности не будут оказывать влияния на поведение моду- лей из библиотеки Python или на устаревший программный код, который опирается на прежнее поведение интерпретатора. В табл. 10.3 перечислены особенности, которые существуют на настоящий момент: Таблица 10.3. Имена особенностей в модуле __future__ Имя особенности Описание nested_scopes Поддержка вложенных областей видимости в функциях. Впервые появилась в Python 2.1 и используется по умолча- нию, начиная с версии Python 2.2. generators Поддержка генераторов. Впервые появилась в Python 2.2 и используется по умолчанию, начиная с версии Python 2.3. division Измененная семантика оператора деления, когда при деле- нии целых чисел возвращается дробное число. Например, выражение 1/4 вернет 0.25 вместо 0. Впервые появилась в Python 2.2 и оставалась отключенной вплоть до версии 2.6. Используется по умолчанию, начиная с версии Python 3.0. absolute_import Измененное поведение операции импортирования относи- тельно пакетов. В настоящее время, когда модуль пакета использует инструкцию импорта, такую как import string, поиск сначала выполняется в текущем каталоге пакета, а за- тем в каталогах, перечисленных в переменной sys.path. Од- нако это делает невозможным использование библиотечных модулей, имена которых совпадают с именами модулей в па- кете. Если включить эту особенность, инструкция import module будет выполнять импортирование по абсолютному пути. То есть такая инструкция, как import string, всегда будет загружать модуль string из стандартной библиотеки. Впервые появилась в Python 2.5 и оставалась отключенной вплоть до версии 2.6. Используется по умолчанию, начиная с версии Python 3.0. with_statement Поддержка менеджеров контекста и инструкции with. Впер- вые появилась в Python 2.5 и используется по умолчанию, начиная с версии Python 2.6. print_function Вместо инструкции print использует функцию print(). Впер- вые появилась в Python 2.6 и используется по умолчанию, начиная с версии Python 3.0. Следует отметить, что имена особенностей никогда не удалялись из модуля __future__ . Благодаря этому, даже если та или иная особенность включена 234 Глава 10. Среда выполнения по умолчанию в более поздних версиях Python, это не повлечет за собой на- рушение работоспособности существующего программного кода, исполь- зующего имена этих особенностей. Завершение программы Программа завершается, когда в файле не остается невыполненных ин- завершается, когда в файле не остается невыполненных ин- завершается, когда в файле не остается невыполненных ин- , когда в файле не остается невыполненных ин- когда в файле не остается невыполненных ин- в файле не остается невыполненных ин- в файле не остается невыполненных ин- файле не остается невыполненных ин- файле не остается невыполненных ин- не остается невыполненных ин- не остается невыполненных ин- остается невыполненных ин- остается невыполненных ин- невыполненных ин- невыполненных ин- ин- ин- струкций, когда возбуждается исключение SystemExit (обычно функцией sys.exit() ) или когда интерпретатор принимает сигнал SIGTERM или SIGHUP (в UNIX). На выходе интерпретатор уменьшает счетчики ссылок во всех объектах во всех существующих пространствах имен (и уничтожает эти пространства имен). Если счетчик ссылок объекта достигает нуля, объект уничтожается и при этом вызывается его метод __del__(). Важно отметить, что в некоторых случаях в процессе завершения про- граммы метод __del__() может не вызываться. Это может происходить из-за наличия циклических ссылок между объектами (в этом случае объ- екты продолжают существовать в памяти, но они будут недоступны после уничтожения пространства имен). Хотя сборщик мусора в интерпретаторе способен определять неиспользуемые циклические ссылки в процессе вы- полнения, он обычно не вызывается при завершении программы. Поскольку нет никаких гарантий, что метод __del__() будет вызван при за- вершении программы, лучше всего предусмотреть явное освобождение не- которых ресурсов, таких как открытые файлы и сетевые соединения. Для этого в пользовательские объекты можно добавить специализированные методы (например, close()). Другая возможность заключается в том, чтобы написать функцию завершения и зарегистрировать ее с помощью модуля atexit , как показано ниже: import atexit connection = open_connection(“deaddot.com”) ёё def cleanup(): print “Завершение...” close_connection(connection) ёё atexit.register(cleanup) Подобным способом можно также вызвать сборщик мусора: import atexit, gc atexit.register(gc.collect) И последнее замечание, касающееся завершения программы: методы __ del__() некоторых объектов могут пытаться обратиться к глобальным дан- ным или методам, объявленным в других модулях. Поскольку к этому мо- менту требуемые объекты уже могут быть уничтожены, в методе __del__() может возникать исключение NameError, которое приводит к появлению со- общения об ошибке, как показано ниже: Exception exceptions.NameError: ‘c’ in Завершение программы 235 (Перевод: Исключение exceptions.NameError: имя ‘c’ в ) Е сли происходит такая ошибка, это означает, что работа метода __del__() была прервана преждевременно. Это также может означать, что не была выполнена какая-то важная операция (например, не было закрыто соеди- нение с сервером). Если подобные ошибки принципиальны, вероятно, луч- ше предусмотреть явное выполнение операций по завершению, а не пола- гаться на то, что интерпретатор уничтожит объекты начисто при выходе из программы. Исключение NameError можно также устранить, определив аргументы по умолчанию в объявлении метода __del__(): import foo class Bar(object): def __del__(self, foo=foo): foo.bar() # Вызывается метод в модуле foo В некоторых случаях бывает необходимо завершать работу программы без выполнения каких-либо заключительных действий. Добиться этого мож- но вызовом функции os._exit(status). Эта функция представляет собой ин- терфейс к низкоуровневому системному вызову exit(), ответственному за уничтожение процесса интерпретатора Python. При вызове этой функции программа завершается немедленно, без выполнения дополнительных дей- ствий. |