Рубрики
Без рубрики

Настройки переводчика

Автор оригинала: Doug Hellmann.

sys содержит атрибуты и функции для доступа к параметрам конфигурации времени компиляции или выполнения для интерпретатора.

Информация о версии во время сборки

Версия, используемая для создания интерпретатора C, доступна в нескольких формах. sys.version – это удобочитаемая строка, которая обычно включает полный номер версии, а также информацию о дате сборки, компиляторе и платформе. sys.hexversion проще использовать для проверки версии интерпретатора, поскольку это простое целое число. При форматировании с использованием hex () ясно, что части sys.hexversion берутся из информации о версии, также видимой в более читаемом sys.version_info (именованный кортеж из пяти частей, представляющий только номер версии). Отдельная версия C API, используемая текущим интерпретатором, сохраняется в sys.api_version .

sys_version_values.py

import sys

print('Version info:')
print()
print('sys.version      =', repr(sys.version))
print('sys.version_info =', sys.version_info)
print('sys.hexversion   =', hex(sys.hexversion))
print('sys.api_version  =', sys.api_version)

Все значения зависят от реального интерпретатора, используемого для запуска программы-примера.

$ python3 sys_version_values.py

Version info:

sys.version      = '3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018,
03:13:28) \n[Clang 6.0 (clang-600.0.57)]'
sys.version_info =,
sys.hexversion   = 0x30701f0
sys.api_version  = 1013

Платформа операционной системы, используемая для создания интерпретатора, сохраняется как sys.platform .

sys_platform.py

import sys

print('This interpreter was built for:', sys.platform)

Для большинства систем Unix значение получается путем объединения вывода uname -s с первой частью версии в uname -r . Для других операционных систем существует жестко запрограммированная таблица значений.

$ python3 sys_platform.py

This interpreter was built for: darwin

Смотрите также

Реализация переводчика

Интерпретатор CPython – одна из нескольких реализаций языка Python. sys.implementation предоставляется для определения текущей реализации библиотек, которым необходимо обойти любые различия в интерпретаторах.

sys_implementation.py

import sys


print('Name:', sys.implementation.name)
print('Version:', sys.implementation.version)
print('Cache tag:', sys.implementation.cache_tag)

sys.implementation.version совпадает с sys.version_info для CPython, но будет отличаться для других интерпретаторов.

$ python3 sys_implementation.py

Name: cpython
Version:,
Cache tag: cpython-37

Смотрите также

  • PEP 421 – добавление sys.implementation

Параметры командной строки

Интерпретатор CPython принимает несколько параметров командной строки для управления своим поведением, перечисленных в таблице ниже.

Флаги параметров командной строки Python

Вариант

Смысл

-B

не записывать файлы .py [co] при импорте

-b

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

-bb

конвертировать байтовые предупреждения в ошибки

-d

вывод отладки из парсера

-E

игнорировать переменные среды PYTHON * (например, PYTHONPATH)

проверять в интерактивном режиме после запуска скрипта

-O

немного оптимизировать сгенерированный байт-код

-OO

удалить строки документации в дополнение к оптимизации -O

-s

не добавляйте каталог сайта пользователя в sys.path

-S

не запускать ‘import site’ при инициализации

-t

выдавать предупреждения о несогласованном использовании вкладок

-tt

выдавать ошибки из-за несогласованного использования вкладок

-v

подробный

Некоторые из них доступны программам для проверки через sys.flags .

sys_flags.py

import sys

if sys.flags.bytes_warning:
    print('Warning on bytes/str errors')
if sys.flags.debug:
    print('Debuging')
if sys.flags.inspect:
    print('Will enter interactive mode after running')
if sys.flags.optimize:
    print('Optimizing byte-code')
if sys.flags.dont_write_bytecode:
    print('Not writing byte-code files')
if sys.flags.no_site:
    print('Not importing "site"')
if sys.flags.ignore_environment:
    print('Ignoring environment')
if sys.flags.verbose:
    print('Verbose mode')

Поэкспериментируйте с sys_flags.py , чтобы узнать, как параметры командной строки сопоставляются с настройками флагов.

$ python3 -S -E -b sys_flags.py

Warning on bytes/str errors
Not importing "site"
Ignoring environment

Unicode по умолчанию

Чтобы получить имя кодировки Unicode по умолчанию, которую использует интерпретатор, вызовите getdefaultencoding () . Значение устанавливается при запуске и не может быть изменено.

Внутренняя кодировка по умолчанию и кодировка файловой системы могут отличаться для некоторых операционных систем, поэтому есть отдельный способ получить настройки файловой системы. getfilesystemencoding () возвращает значение ОС ( не файловой системы).

sys_unicode.py

import sys

print('Default encoding     :', sys.getdefaultencoding())
print('File system encoding :', sys.getfilesystemencoding())

Вместо того, чтобы полагаться на глобальную кодировку по умолчанию, большинство экспертов по Unicode рекомендуют сделать приложение явно поддерживающим Unicode. Это дает два преимущества: различные кодировки Unicode для разных источников данных могут обрабатываться более чисто, а количество предположений о кодировках в коде приложения сокращается.

$ python3 sys_unicode.py

Default encoding     : utf-8
File system encoding : utf-8

Интерактивные подсказки

Интерактивный интерпретатор использует два отдельных приглашения для указания уровня ввода по умолчанию ( ps1 ) и «продолжения» многострочного оператора ( ps2 ). Значения используются только интерактивным интерпретатором.

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>>

Любую или обе подсказки можно изменить на другую строку.

>>> sys.ps1 = '::: '
::: sys.ps2 = '~~~ '
::: for i in range(3):
~~~   print i
~~~
0
1
2
:::

В качестве альтернативы для приглашения можно использовать любой объект, который можно преобразовать в строку (через __str__ ).

sys_ps1.py

import sys


class LineCounter:

    def __init__(self):
        self.count  0

    def __str__(self):
        self.count  1
        return '({:3d})> '.format(self.count)

LineCounter отслеживает, сколько раз он был использован, поэтому число в приглашении увеличивается каждый раз.

$ python
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> from sys_ps1 import LineCounter
>>> import sys
>>> sys.ps1 = LineCounter()
(  1)>
(  2)>
(  3)>

Крючок для дисплея

sys.displayhook вызывается интерактивным интерпретатором каждый раз, когда пользователь вводит выражение. Результат вычисления выражения передается функции как единственный аргумент.

sys_displayhook.py

import sys


class ExpressionCounter:

    def __init__(self):
        self.count  0
        self.previous_value  self

    def __call__(self, value):
        print()
        print('  Previous:', self.previous_value)
        print('  New     :', value)
        print()
        if value  self.previous_value:
            self.count  1
            sys.ps1  '({:3d})> '.format(self.count)
        self.previous_value  value
        sys.__displayhook__(value)


print('installing')
sys.displayhook  ExpressionCounter()

Значение по умолчанию (сохраненное в sys .__ displayhook__ ) выводит результат на стандартный вывод и сохраняет его в _ для удобства использования позже.

$ python3
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> import sys_displayhook
installing
>>> 1 + 2

  Previous: 
  New     : 3

3
(  1)> 'abc'

  Previous: 3
  New     : abc

'abc'
(  2)> 'abc'

  Previous: abc
  New     : abc

'abc'
(  2)> 'abc' * 3

  Previous: abc
  New     : abcabcabc

'abcabcabc'
(  3)>

Установить местоположение

Путь к реальной программе интерпретатора доступен в sys.executable во всех системах, для которых имеет смысл иметь путь к интерпретатору. Это может быть полезно для обеспечения использования правильного интерпретатора, а также дает подсказки о путях, которые могут быть установлены на основе местоположения интерпретатора.

sys.prefix относится к родительскому каталогу установки интерпретатора. Обычно он включает каталоги bin и lib для исполняемых файлов и установленных модулей соответственно.

sys_locations.py

import sys

print('Interpreter executable:')
print(sys.executable)
print('\nInstallation prefix:')
print(sys.prefix)

Этот пример вывода был получен на Mac, на котором запущена сборка фреймворка, установленная с python.org.

$ python3 sys_locations.py

Interpreter executable:
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3

Installation prefix:
/Library/Frameworks/Python.framework/Versions/3.5