Python модуль sys: Модуль sys | Python 3 для начинающих и чайников
Модуль sys | Python 3 для начинающих и чайников
Модуль sys обеспечивает доступ к некоторым переменным и функциям, взаимодействующим с интерпретатором python.
sys.argv — список аргументов командной строки, передаваемых сценарию Python. sys.argv[0] является именем скрипта (пустой строкой в интерактивной оболочке).
sys.byteorder — порядок байтов. Будет иметь значение ‘big’ при порядке следования битов от старшего к младшему, и ‘little’, если наоборот (младший байт первый).
sys.builtin_module_names — кортеж строк, содержащий имена всех доступных модулей.
sys.call_tracing(функция, аргументы) — вызывает функцию с аргументами и включенной трассировкой, в то время как трассировка включена.
sys.copyright — строка, содержащая авторские права, относящиеся к интерпретатору Python.
sys._clear_type_cache() — очищает внутренний кэш типа.
sys._current_frames() — возвращает словарь-отображение идентификатора для каждого потока в верхнем кадре стека в настоящее время в этом потоке в момент вызова функции.
sys.dllhandle — целое число, определяющее дескриптор DLL Python (Windows).
sys.exc_info() — возвращает кортеж из трех значений, которые дают информацию об исключениях, обрабатывающихся в данный момент.
sys.exec_prefix — каталог установки Python.
sys.executable — путь к интерпретатору Python.
sys.exit([arg]) — выход из Python. Возбуждает исключение SystemExit, которое может быть перехвачено.
sys.flags — флаги командной строки. Атрибуты только для чтения.
sys.float_info — информация о типе данных float.
sys.float_repr_style — информация о применении встроенной функции repr() для типа float.
sys.getdefaultencoding() — возвращает используемую кодировку.
sys.getdlopenflags() — значения флагов для вызовов dlopen().
sys.getfilesystemencoding() — возвращает кодировку файловой системы.
sys.getrefcount(object) — возвращает количество ссылок на объект. Аргумент функции getrefcount — еще одна ссылка на объект.
sys.getrecursionlimit() — возвращает лимит рекурсии.
sys.getsizeof(object[, default]) — возвращает размер объекта (в байтах).
sys.getswitchinterval() — интервал переключения потоков.
sys.getwindowsversion() — возвращает кортеж, описывающий версию Windows.
sys.hash_info — информация о параметрах хэширования.
sys.hexversion — версия python как шестнадцатеричное число (для 3.2.2 final это будет 30202f0).
sys.implementation — объект, содержащий информацию о запущенном интерпретаторе python.
sys.int_info — информация о типе int.
sys.intern(строка) — возвращает интернированную строку.
sys.last_type, sys.last_value, sys.last_traceback — информация об обрабатываемых исключениях. По смыслу похоже на sys.exc_info().
sys.maxsize — максимальное значение числа типа Py_ssize_t (231 на 32-битных и 263 на 64-битных платформах).
sys.maxunicode — максимальное число бит для хранения символа Unicode.
sys.modules — словарь имен загруженных модулей. Изменяем, поэтому можно позабавиться 🙂
sys.path — список путей поиска модулей.
sys.path_importer_cache — словарь-кэш для поиска объектов.
sys.platform — информация об операционной системе.
Linux (2.x and 3.x) | ‘linux’ |
Windows | ‘win32’ |
Windows/Cygwin | ‘cygwin’ |
Mac OS X | ‘darwin’ |
OS/2 | ‘os2’ |
OS/2 EMX | ‘os2emx’ |
sys.prefix — папка установки интерпретатора python.
sys.ps1, sys.ps2 — первичное и вторичное приглашение интерпретатора (определены только если интерпретатор находится в интерактивном режиме). По умолчанию sys.ps1 == «>>> «, а sys.ps2 == «… «.
sys.dont_write_bytecode — если true, python не будет писать .pyc файлы.
sys.setdlopenflags(flags) — установить значения флагов для вызовов dlopen().
sys.setrecursionlimit(предел) — установить максимальную глубину рекурсии.
sys.setswitchinterval(интервал) — установить интервал переключения потоков.
sys.settrace(tracefunc) — установить «след» функции.
sys.stdin — стандартный ввод.
sys.stdout — стандартный вывод.
sys.stderr — стандартный поток ошибок.
sys.__stdin__, sys.__stdout__, sys.__stderr__ — исходные значения потоков ввода, вывода и ошибок.
sys.tracebacklimit — максимальное число уровней отслеживания.
sys.version — версия python.
sys.api_version — версия C API.
sys.version_info — Кортеж, содержащий пять компонентов номера версии.
sys.warnoptions — реализация предупреждений.
sys.winver — номер версии python, использующийся для формирования реестра Windows.
Если что-то пропустил (а я вполне мог это сделать), прошу в комментарии 🙂
Разбираем модуль sys
Модуль sys предоставляет системе особые параметры и функции. В данном разделе мы рассмотрим следующее:
- sys.argv
- sys.executable
- sys.exit
- sys.modules
- sys.path
- sys.platform
- sys.stdin/stdout/stderr
sys.argv
Значение sys.argv – это список аргументов командной строки, которые причастны к скрипту Python. Первый аргумент, argv[0], имеет аналогичное скрипту Python наименование. В зависимости от платформы, на которой вы работаете, первый аргумент может содержать полный путь к скрипту или к названию файла. Для дополнительных деталей обратитесь к документации. А тем временем, попробуем поработать с парочкой примеров, чтобы познакомиться с этим инструментом:
import sys
print(sys.argv)
# Ответ: [»]
| import sys print(sys.argv) # Ответ: [»] |
Если вы запустите это в интерпретаторе, вы получите список с пустой строкой. Давайте создадим файл под названием sysargv.py, со следующим содержимым:
import sys
print(sys.argv)
| import sys
print(sys.argv) |
Теперь запустите код в IDLE. Вы увидите список с одним элементом, который содержит путь к вашему скрипту. Попробуем передать скрипту несколько аргументов. Откройте окно терминала \ консоли и при помощи команды cd измените каталоги на тот, в котором находится скрипт. После этого, запустите что-то наподобие этого:
sys.argv
Обратите внимание на то, что будет выведено на экран:
[‘sysargv.py’, ‘-v’, ‘somefile.py’]
| [‘sysargv.py’, ‘-v’, ‘somefile.py’] |
Первый аргумент – это название файла нашего скрипта. Следующие два аргумента в списке – это те, что мы передали нашему скрипту в командной строке.
sys.executable
Значение sys.executable – это полный путь к интерпретатору Python. Это очень полезно, когда вы используете чей-то компьютер, и вам нужно узнать, где установлен Python. В некоторых системах, данная команда не сработает, и выдаст пустую строку с надписью None. Посмотрим, как пользоваться этой функцией:
import sys
print(sys.executable)
# Вывод: ‘C:\\Python27\\pythonw.exe’
| import sys
print(sys.executable) # Вывод: ‘C:\\Python27\\pythonw.exe’ |
sys.exit
Данная функция позволяет разработчику выйти из Python. Функция exit принимает необязательный аргумент, обычно целое число, которое дает статус выхода. Ноль считается как успешное завершение. Обязательно проверьте, имеет ли ваша операционная система какие-либо особые значения для своих статусов выхода, чтобы вы могли следить за ними в своем собственном приложении. Обратите внимание на то, что когда вы вызываете exit, это вызовет исключение SystemExit, которое позволяет функциям очистки работать в конечных пунктах блоков try / except. Давайте взглянем на то, как вызывается данная функция:
import sys
sys.exit(0)
Traceback (most recent call last):
File «<pyshell#5>», line 1, in <module>
sys.exit(0)
SystemExit: 0
| import sys sys.exit(0)
Traceback (most recent call last): File «<pyshell#5>», line 1, in <module> sys.exit(0) SystemExit: 0 |
Запустив данный код в IDLE, вы увидите возникшую ошибку SystemExit. Давайте создадим несколько скриптов для теста. Для начала вам нужно создать основной скрипт, программу, которая будет вызывать другой скрипт Python. Давайте назовем его “call_exit.py”. Скрипт должен содержать следующее:
import subprocess
code = subprocess.call([«python.exe», «exit.py»])
print(code)
| import subprocess
code = subprocess.call([«python.exe», «exit.py»]) print(code) |
Теперь создайте скрипт Python под названием“exit.py” и сохраните его в той же папке. Вставьте в него следующий код:
Теперь давайте запустим его:
sys.exit
Как вы могли заметить, написанный нами скрипт exit вернул ноль, так что он успешно заработал. Получается, мы заодно научились вызывать разные скрипты Python изнутри самого Python!
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
sys.path
Значение функции path модуля sys – это список строк, которые указывают путь поиска для модулей. Как правило, данная функция указывает Python, в каких локациях смотреть, когда он пытается импортировать модуль. В соответствии с документацией Python, sys.path инициализируется из переменной окружения PYTHONPATH, плюс зависимое от установки значение, указанное по умолчанию. Давайте взглянем на пример:
import sys
print(sys.path)
| import sys print(sys.path) |
Результат:
[»,
‘C:\\Python27\\Lib\\idlelib’,
‘C:\\Python27\\lib\\site-packages\\setuptools-0.9.5-py2.7.egg’,
‘C:\\Python27\\lib\\site-packages\\pip-1.3.1-py2.7.egg’,
‘C:\\Python27\\lib\\site-packages\\sphinx-1.2b3-py2.7.egg’,
‘C:\\Python27\\lib\\site-packages\\docutils-0.11-py2.7.egg’,
‘C:\\Python27\\lib\\site-packages\\pygments-1.6-py2.7.egg’,
‘C:\\Windows\\system32\\python27.zip’,
‘C:\\Python27\\DLLs’,
‘C:\\Python27\\lib’,
‘C:\\Python27\\lib\\plat-win’,
‘C:\\Python27\\lib\\lib-tk’,
‘C:\\Python27’,
‘C:\\Python27\\lib\\site-packages’,
‘C:\\Python27\\lib\\site-packages\\PIL’,
‘C:\\Python27\\lib\\site-packages\\wx-2.9.4-msw’]
| [», ‘C:\\Python27\\Lib\\idlelib’, ‘C:\\Python27\\lib\\site-packages\\setuptools-0.9.5-py2.7.egg’, ‘C:\\Python27\\lib\\site-packages\\pip-1.3.1-py2.7.egg’, ‘C:\\Python27\\lib\\site-packages\\sphinx-1.2b3-py2.7.egg’, ‘C:\\Python27\\lib\\site-packages\\docutils-0.11-py2.7.egg’, ‘C:\\Python27\\lib\\site-packages\\pygments-1.6-py2.7.egg’, ‘C:\\Windows\\system32\\python27.zip’, ‘C:\\Python27\\DLLs’, ‘C:\\Python27\\lib’, ‘C:\\Python27\\lib\\plat-win’, ‘C:\\Python27\\lib\\lib-tk’, ‘C:\\Python27’, ‘C:\\Python27\\lib\\site-packages’, ‘C:\\Python27\\lib\\site-packages\\PIL’, ‘C:\\Python27\\lib\\site-packages\\wx-2.9.4-msw’] |
Данная функция может быть весьма полезной во время отладки причины, по которой модуль не импортируется. Вы также можете изменить путь. Так как данная функция является путем, мы можем добавлять или удалять путь из неё. Давайте взглянем на то, как добавлять путь:
sys.path.append(«/path/to/my/module»)
| sys.path.append(«/path/to/my/module») |
Удаление пути я оставлю как задание для читателя
sys.platform
Значение sys.platform – идентификатор платформы. Вы можете использовать sys.platform чтобы добавлять модули к sys.path, импортировать разные модули, в зависимости от платформы, или запускать разные части кода. Давайте взглянем:
import sys
print(sys.platform) # ответ: ‘win32’
| import sys print(sys.platform) # ответ: ‘win32’ |
В данном примере мы видим, что Python работает в Windows. Вот пример того, как мы можем воспользоваться данной информацией:
import sys
os = sys.platform
if os == «win32»:
# Работаем с реестром Windows
import _winreg
elif os.startswith(‘linux’):
# Выполняем Linux комманду
import subprocess
subprocess.Popen([«ls, -l»])
| import sys
os = sys.platform if os == «win32»: # Работаем с реестром Windows import _winreg elif os.startswith(‘linux’): # Выполняем Linux комманду import subprocess subprocess.Popen([«ls, -l»]) |
Данный код показывает способы проверки того, используем ли мы определенную операционную систему. Если мы используем Windows, мы получим определенную информацию из реестра Windows, при помощи модуля Python под названием _winreg. Если мы используем Linux, мы можем выполнить команду ls, чтобы получить информацию о каталоге, в котором мы находимся.
sys.stdin / stdout / stderr
Stdin, stdout и stderr сопоставляются с файловыми объектами, которые соответствуют стандартным входам, выходам и потокам ошибок интерпретатора соответственно. Функция stdin используется для всех входов, используемых интерпретатором, за исключением скриптов, тогда как stdout используется для выходов операторов print и expression. Главная причина, по которой я акцентирую на этом внимание, заключается в том, что в какой-то момент вам нужно будет перенаправить stdout или stderr, или обе функции к файлу, такому как log, либо же какой-либо дисплей в пользовательском графическом интерфейсе, созданным вами. Вы также можете перенаправить stdin, но с такими случаями я практически не сталкивался.
Подведем итоги
Существует много других значений и методов в модуле sys. Обратитесь к документации Python, а именно к секции 27.1, если вам нужно углубиться в данный вопрос. Мы многому научились из данной статьи, поздравляю. Теперь вы знаете, как выйти из программы Python, как получить информацию о платформе, работать с аргументами, переданными командной строке, и многому другому.
argv, maxsize, path, version и exit ~ PythonRu
Модуль sys
предлагает методы, которые позволяют работать с разными элементами среды выполнения Python. С его помощью можно взаимодействовать с интерпретатором, используя разные функции. Но для начала его нужно импортировать.
import sys
В этом материале речь пойдет о следующих возможностях модуля sys
:
sys.argv
sys.maxsize
sys.path
sys.version
sys.exit
sys.argv
Метод argv
возвращает аргументы командной строки, переданные скрипту Python, в виде списка. Важно отметить, что первый аргумент (с индексом 0
) в списке — это название самого скрипта. Остальные представлены в виде последовательности.
В следующем примере файл с кодом называется test.py
.
Время для примера:
import sys
print("Привет {}. Добро пожаловать в руководство по {} на {}".format(sys.argv[1], sys.argv[2], sys.argv[3]))
Сохраните этот код в файле test.py
и запустите его в командной строке вместе со следующими аргументами:
python test.py Студенты sys PythonRu
Перед этим необходимо перейти в директорию с файлом или ввести полный абсолютный путь к нему.
В указанной выше команде первым аргументом функции argv
является элемент Студенты
. sys
и PythonRu
— второй и третий аргументы.
Подписывайтесь на телеграм каналы
Нулевым параметром является название самого скрипта, которое командная строка определяет автоматически.
Вывод:
Привет Студенты. Добро пожаловать в руководство по sys на PythonRu
sys.maxsize
Эта функция возвращает целое число, которое обозначает, какое максимально значение может иметь переменная типа Py_ssize_t
в программе Python. Это значение зависит от платформы, где программа была запущена. Если это 32-битная платформа, значение обычно 2*33 — 1 (2147483647), а в 64-битной — 2**63 — 1 (9223372036854775807).
Пример (обновите код в test.py
):
import sys
print(sys.maxsize)
Вывод:
9223372036854775807
sys.path
Метод path
из модуля sys
возвращает все пути для поиска модулей Python. Формат вывода — список строк.
Ту же операцию можно выполнить обратившись к переменным среды в панели управления и найдя в ней PYTHONPATH
. Первый элемент вывода — расположение исполняемого скрипта. Если же эта директория недоступна, то первый элемент будет пустой.
Такое может произойти в том случае, если скрипт был вызван интерактивно (с помощью IDLE, интегрированной среды разработки и обучения на языке Python) или же из стандартного ввода (с помощью инструкции exec
). В дальнейшем список может быть изменен в соответствии с требованиями. В него можно добавлять только строки и байты (другие типы будут игнорироваться).
Пример:
import sys
print(sys.path)
Вывод:['C:\\Users\\user_name, 'C:\\Users\\ user_name \\Anaconda3\\pkgs\\nb_anacondacloud-1.2.0-py35_0\\Lib\\site-packages\\nb_anacondacloud-1.2.0-py3.5.egg-info', 'C:\\Users\\ user_name \\AppData\\Local\\Programs\\Python\\Python36\\python.exe', 'C:\\ProgramData\\Anaconda3\\DLLs', 'C:\\ProgramData\\Anaconda3\\lib', 'C:\\ProgramData\\Anaconda3', '', 'C:\\ProgramData\\Anaconda3\\lib\\site-packages', 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\win32', 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\IPython\\extensions', 'C:\\Users\\ user_name \\.ipython']
sys.version
Этот метод показывает версию интерпретатора Python. Он также предоставляет информацию о номере сборки и компиляторе. Информация отображается в виде строки. Рекомендуется использовать метод version_info
для получения информации о версии, а не извлекать ее из вывода sys.version
.
Пример:
import sys
print(sys.version)
Вывод:
3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)]
sys.exit
Метод exit
выходит из программы Python или завершает конкретный процесс. Он используется для безопасного завершения программы в случае исключения. Под капотом sys.exit
вызывает исключение SystemExit
. Это то же самое, что exit
или quit
в Python.
При вызове SystemExit
также исполняются функции блока finally
из инструкции try
.
Этот метод может включать опциональный аргумент. Его значение по умолчанию равно 0
, что значит, что программа была завершена нормально. Если значение отличается, это говорит о не-нормальном завершении.
Пример:
import sys
sys.exit()
sys.exit(0)
Выводы:
В этом материале вы познакомились с базовыми методами из модуля sys
, которые помогают взаимодействовать со средой исполнения Python.
Работа с модулями: создание, подключение инструкциями import и from
Модулем в Python называется любой файл с программой (да-да, все те программы, которые вы писали, можно назвать модулями). В этой статье мы поговорим о том, как создать модуль, и как подключить модуль, из стандартной библиотеки или написанный вами.
Каждая программа может импортировать модуль и получить доступ к его классам, функциям и объектам. Нужно заметить, что модуль может быть написан не только на Python, а например, на C или C++.
Подключение модуля из стандартной библиотеки
Подключить модуль можно с помощью инструкции import. К примеру, подключим модуль os для получения текущей директории:
>>> import os >>> os.getcwd() 'C:\\Python33'
После ключевого слова import указывается название модуля. Одной инструкцией можно подключить несколько модулей, хотя этого не рекомендуется делать, так как это снижает читаемость кода. Импортируем модули time и random.
>>> import time, random >>> time.time() 1376047104.056417 >>> random.random() 0.9874550833306869
После импортирования модуля его название становится переменной, через которую можно получить доступ к атрибутам модуля. Например, можно обратиться к константе e, расположенной в модуле math:
>>> import math >>> math.e 2.718281828459045
Стоит отметить, что если указанный атрибут модуля не будет найден, возбудится исключение AttributeError. А если не удастся найти модуль для импортирования, то ImportError.
>>> import notexist Traceback (most recent call last): File "", line 1, in import notexist ImportError: No module named 'notexist' >>> import math >>> math.Ё Traceback (most recent call last): File "", line 1, in math.Ё AttributeError: 'module' object has no attribute 'Ё'
Использование псевдонимов
Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова as.
>>> import math as m >>> m.e 2.718281828459045
Теперь доступ ко всем атрибутам модуля math осуществляется только с помощью переменной m, а переменной math в этой программе уже не будет (если, конечно, вы после этого не напишете import math, тогда модуль будет доступен как под именем m, так и под именем math).
Инструкция from
Подключить определенные атрибуты модуля можно с помощью инструкции from. Она имеет несколько форматов:
from <Название модуля> import <Атрибут 1> [ as <Псевдоним 1> ], [<Атрибут 2> [ as <Псевдоним 2> ] ...] from <Название модуля> import *
Первый формат позволяет подключить из модуля только указанные вами атрибуты. Для длинных имен также можно назначить псевдоним, указав его после ключевого слова as.
>>> from math import e, ceil as c >>> e 2.718281828459045 >>> c(4.6) 5
Импортируемые атрибуты можно разместить на нескольких строках, если их много, для лучшей читаемости кода:
>>> from math import (sin, cos, ... tan, atan)
Второй формат инструкции from позволяет подключить все (точнее, почти все) переменные из модуля. Для примера импортируем все атрибуты из модуля sys:
>>> from sys import * >>> version '3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)]' >>> version_info sys.version_info(major=3, minor=3, micro=2, releaselevel='final', serial=0)
Следует заметить, что не все атрибуты будут импортированы. Если в модуле определена переменная __all__ (список атрибутов, которые могут быть подключены), то будут подключены только атрибуты из этого списка. Если переменная __all__ не определена, то будут подключены все атрибуты, не начинающиеся с нижнего подчёркивания. Кроме того, необходимо учитывать, что импортирование всех атрибутов из модуля может нарушить пространство имен главной программы, так как переменные, имеющие одинаковые имена, будут перезаписаны.
Создание своего модуля на Python
Теперь пришло время создать свой модуль. Создадим файл mymodule.py, в которой определим какие-нибудь функции:
def hello(): print('Hello, world!') def fib(n): a = b = 1 for i in range(n - 2): a, b = b, a + b return b
Теперь в этой же папке создадим другой файл, например, main.py:
import mymodule mymodule.hello() print(mymodule.fib(10))
Выведет:
Hello, world! 55
Поздравляю! Вы сделали свой модуль! Напоследок отвечу ещё на пару вопросов, связанных с созданием модулей:
Как назвать модуль?
Помните, что вы (или другие люди) будут его импортировать и использовать в качестве переменной. Модуль нельзя именовать также, как и ключевое слово (их список можно посмотреть тут). Также имена модулей нельзя начинать с цифры. И не стоит называть модуль также, как какую-либо из встроенных функций. То есть, конечно, можно, но это создаст большие неудобства при его последующем использовании.
Куда поместить модуль?
Туда, где его потом можно будет найти. Пути поиска модулей указаны в переменной sys.path. В него включены текущая директория (то есть модуль можно оставить в папке с основной программой), а также директории, в которых установлен python. Кроме того, переменную sys.path можно изменять вручную, что позволяет положить модуль в любое удобное для вас место (главное, не забыть в главной программе модифицировать sys.path).
Можно ли использовать модуль как самостоятельную программу?
Можно. Однако надо помнить, что при импортировании модуля его код выполняется полностью, то есть, если программа что-то печатает, то при её импортировании это будет напечатано. Этого можно избежать, если проверять, запущен ли скрипт как программа, или импортирован. Это можно сделать с помощью переменной __name__, которая определена в любой программе, и равна «__main__», если скрипт запущен в качестве главной программы, и имя, если он импортирован. Например, mymodule.py может выглядеть вот так:
def hello(): print('Hello, world!') def fib(n): a = b = 1 for i in range(n - 2): a, b = b, a + b return b if __name__ == "__main__": hello() for i in range(10): print(fib(i))
Как правильно импортировать модули в Python: 4 полезных примера
В крупных Data Science проектах часто приходится сталкиваться с тем, что Python-приложение разрастается и его нужно как-то организовывать. В этой статье мы расскажем вам, как работать с пакетами и модулями Python: разберем запуск модулей, прямые и косвенные обращения, объединение в пакеты, относительные импорты и рекомендации PEP 8 по импорту.
Запуск модулей в командной строке
Python-файлы, или модули, с расширением .py запускаются с командной строки. Файлы, которые находятся в одной папке, могут импортировать переменные, функции и классы друг друга. Рассмотрим пример с двумя файлами, один из которых импортирует функцию другого:
# Файл one.py def foo(s): print(s) foo("python")
# Файл two.py import one one.foo("school")
Строчка import one
не только импортирует файл, но и запускает его, поэтому можно наблюдать двойной результат:
$ python one.py python $ python two.py python school
Для импорта конкретных объектов используют конструкцию from ... import ...
, тогда не потребуется писать вызовы через точку. Ниже показан пример такого использования.
# Файл two.py from one import foo foo("school")
$ python two.py python school
В Python нет главной функции main
В отличие от многих языков программирования, в Python нет функции main()
, которая запускает всю программу. Но, возможно, вам встречалось видеть __name__ == “__main__”
. Дело в том, что Python создает переменную __name__
, которой присваивается имя модуля такое, что:
- если модуль запускается напрямую, то этой переменной будет присвоено
__main__
; - если модуль будет запущен через импорт, то ему будет присвоено само название модуля.
Допустим, у нас также имеется два файла, лежащие в одной папке:
# Файл one.py def foo(s): print(s) def bar(): print(__name__) if __name__ == "__main__": foo("python") bar()
# Файл two.py import one one.foo("school") one.bar()
Запуск файла one.py
присвоит переменной __name__
значение __main__
, тогда этот блок с if
сработает:
$ python one.py python __main__
Запуск файла two.py
, который содержит импорт файла one.py не запустит блок с if, потому что название модуля соответствует one:
$ python two.py school one
В конструкцию __name__ == “__main__”
вставляют код, который может быть запущен только в результате прямого обращения.
Объединяем модули в пакеты
Разбиение разного функционала по файлам – хорошая идея, поскольку в будущем будет удобно к ним обращаться. Именно такую иерархическую структуру имеют библиотеки и фреймворки: мы знаем, что, например, в tf.keras
находится классы для создания архитектуры модели машинного обучения (Machine Learning). Обсудим, что нужно, чтобы организовать свои Python-файлы.
Объединение файлов под одним названием называется пакетом. Чтобы инициализировать такой пакет, достаточно создать пустой файл __init__.py
в папке. Вот так, например, может выглядеть структура пакета:
ml/ __init__.py supervised_learning/ __init__.py decision_tree.py linear_reg.py unsupervised_learning/ __init__.py pca.py k_means.py
Заметим, что сам пакет ml
имеет также два других пакета, так как у каждого из них имеется файл __init__.py
. Теперь импорты могут выглядеть следующим образом:
import ml.supervised_learning.decision_trees from ml.supervised_learning import decision_trees import ml.unsupervised_learning.pca as pca
Эти три строчки примеры абсолютного импорта.
Относительные импорты внутри пакета
Импорт модулей может быть также и относительным. Обращаясь к предыдущему примеру с пакетом ml
, требуется в модуле unsupervised_learning.pca
импортировать k_means
. Это выглядит так:
# внутри ml/unsupervised_learning/pca.py from . import k_means
А чтобы из этого же модуля импортировать supervised_learning.linear_reg
, нужно добавить две точки:
# внутри ml/unsupervised_learning/pca.py from ..supervised_learning import linear_reg
Относительные импорты должны содержать ключевое слово from
. Ниже рассмотрены правильные и неправильные варианты.
# внутри ml/unsupervised_learning/pca.py from . import k_means # ОК (относительный импорт) from ml.unsupervised_learning import k_means # ОК (абсолютный импорт) import k_means # Ошибка import .k_means # Ошибка
С одной стороны, абсолютный импорт делает код более явным: понятно, что и откуда импортируется; с другой стороны, изменение названия пакета приведет к изменению всех частей кода, где он используется.
Наконец, стоит отметить, что относительные импорты работают только для модулей надлежащего пакета, поэтому попытка обратиться к ним со стороны может оказаться неудачей. Но, чтобы обойти эту проблему, нужно указать флаг -m
и запустить в виде модуля. Примеры ниже иллюстрируют правильный и неправильный способ запуска модулей со стороны, которые содержат относительные импорты.
$ python ml/unsupervised_learning/pca.py # Ошибка относительных импортов $ python -m ml.unsupervised_learning.pca # ОК
Рекомендации PEP 8
Здесь мы также приведем примеры импорта согласно PEP 8 – документ с рекомендациями по стилю кодированию на Python.
- Импорт отдельных модулей/пакетов должны осуществляться на разных строчках:
# Правильно import os import sys
# Неправильно import os, sys
Тем не менее, в порядке вещей импортировать объекты из одного модуля/пакета:
# Правильно from subprocess import Popen, PIPE
- Импорты должны находится вверху файла, после комментариев к модулям, после документации и перед глобальными переменными и константами.
- Все “dunders”, то есть все объекты Pythonс двумя нижними подчеркиваниям, должны находиться перед импортами:
"""Это документация к модулю Все dunders находятся перед импортами. """ from __future__ import barry_as_FLUFL __all__ = ['a', 'b', 'c'] __version__ = '0.1' __author__ = 'Cardinal Biggles' import os import sys
- Импорты должны быть сгруппированы по следующему порядку:
- Стандартные Python-библиотеки.
- Связанные сторонние библиотеки.
- Локальные пакеты/модули.
Пустая строка должна быть после каждой группы импортов.
- Рекомендуется использовать абсолютные импорты, так как они более читаемы и отлаживаемы:
import mypkg.sibling from mypkg import sibling from mypkg.sibling import example
Однако, если ваш пакет очень сложно устроен и имеет много вложений, то можно использовать и относительные импорты, чтобы избежать длинного перечисления. С другой стороны, следует задуматься, нужна ли вам такая сложная структура.
- Конструкции
from <module> import *
, которая импортирует все из модуля, нужно избегать, так как есть вероятность, что переменные импортированного модуля и переменные настоящего модуля будут иметь схожие названия.
В следующей статье поговорим о тестировании кода на Python. А как на практике эффективно организовать файлы с вашими Data Science проектами, вы узнаете на наших Python-курсах в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.
Создание модулей Python 3 | Блог
Как самому создавать и импортировать модули?
Модулями называют файлы с .ру расширением, которые содержат код Python. Вы можете сослаться на любой такой файл, как на модуль. Вы можете найти их в Python Standard Library. Кроме того, некоторые модули по умолчанию загружаются вместе с Python. Вы можете также поставить необходимые модули посредством пакетного менеджера pip. Вы также сможете самостоятельно писать свои модули на Python. Наше руководство поможет вам это сделать.
Создание и импорт модулей
Процесс написания модулей ничем не отличается от создания любого другого файла Python. Внутри могут быть определения классов, функций, переменных, которые вы сможете потом применять в других Python-программах.
Как же написать модуль? Сначала потребуется развернуть среду разработки. В ней создайте файл с расширением .py, например hello.py. Вы сможете потом импортировать его в другой файл. Внутрь нужно записать функцию:
def world():
print("Hello, World!")
Вы также можете запустить файл командой:
python hello.py
В той же папке необходимо создать файл main_program.py. В него нужно импортировать созданный модуль, а потом вызывайте функцию. Файлы должны располагаться в одном каталоге, ведь модуль не встроенный. Иначе Python не сможет его найти. Наберите:
# Импортируйте модуль hello
import hello
# Вызовите функцию
hello.world()
После импортирования модуля нужно вызвать функцию посредством ссылки на имя модуля в точечной нотации. Вы также можете импортировать модуль вот таким способом:
rom hello import world
А потом вызвать его вот как world(). Теперь предстоит запустить программу через командную строку:
python main_program.py
И у вас в терминале появятся вот такие строки:
Hello, World!
Теперь мы с вами добавим переменную в модуль hello.py:
# Определите функцию
def world():
print("Hello, World!")
# Определите переменную
some = "some"
При помощи функции print() осуществите вызов переменной в нашем файле main_program.py:
# Импортируйте модуль hello
import hello
# Вызовите функцию
hello.world()
# Отобразите переменную
print(hello.some)
Теперь при запуске программы на экране будет вот такая надпись:
Hello, World!
some
Попробуем теперь переопределить класс в hello.py. Нам потребуется класс user, имеющий атрибуты mood и name. Нужна также функция, выводящая эти атрибуты:
# Определите функцию
def world():
print("Hello, World!")
# Определите переменную
some = "some"
# Определите класс
class User:
def __init__(self, name, mood):
self.mood = mood
self.name = name
def tell_me_about_the_user(self):
print("This user is " + self.mood + ".")
print(self.name + " is the user's name.")
Теперь потребуется добавить класс в самый низ файла main_program.py. Наберите:
# Импортируйте модуль hello
import hello
# Вызовите функцию
hello.world()
# Отобразите переменную
print(hello.some)
# Вызовите класс
jesse = hello.User("Jesse", "sad")
jesse.tell_me_about_the_user()
Если вызвать класс User посредством hello.User(), то получите доступ к атрибутам и функциям в именном пространстве файла main_program.py. Для этого на последней строке и пишется jesse.tell_me_about_the_user() без вызова hello. Без ссылки на данный модель получится также вызвать любой атрибут класса. При запуске приложения вы увидите:
Hello, World!
Some
This user is sad.
Jesse is the user's name.
Помните, что модули могут реализовывать код, а не только хранят определения. Мы перепишем файл hello.py, чтобы увидеть как это работает. Нужно лишь реализовать функция world():
# Определите функцию
def world():
print("Hello, World!")
# Вызовите функцию внутри модуля
world()
Следующий шаг — удаление всех строк из файла main_program.py за исключением import:
import hello
Теперь запустите программу main_program.py, и вы увидите на экране:
Hello, World!
Что произошло? Модуль hello реализовал функцию world(). Она передалась в файл main_program.py, при запуске которого и выполняется.
Доступ к модулям из иной папки
Вы можете использовать модули одновременно в нескольких программах либо проектах. В такой ситуации все держать в одной папке проблематично. Файлы проще всего хранить в отдельных папках проектов. Если вы хотите применить модуль из одного проекта в другом, то это получится сделать несколькими способами:
1) Добавить путь
Вы можете вызвать путь модуля с помощью программных файлов, использующих его. Это не более чем временное решение, которое подходит для этапа разработки. Такой подход не позволит сделать один модуль доступным для всей вашей системы.
Для добавления пути модуля в иной файл, нужно импортировать sys с другими модулями, которые вам потребуются в главном файле программы. Модуль sys вы сможете найти в Python Standard Library. Он нужен для предоставления индивидуальных системных параметров и функций, посредством которых получится задать путь нужного модуля.
Например, вы создали файл hello.py в папке /user/some/. При этом в старом каталоге у вас остался файл main_program.py. Для импорта модуля hello.py в main_program.py нужно перенести sys добавив путь /user/some/. По нему Python и сможет найти указанный файл. Наберите:
import sys
sys.path.append('/user/some/')
import hello
...
Если правильно задать путь к файлу hello.py, получится запустить без ошибок main_program.py. У нас будет такой же вывод, как и раньше.
2) Добавить модуль в путь Python
Такой вариант более удобный и его можно использовать постоянно. Вы добавляете модуль в путь, откуда Python берет пакеты и модули. Ваш модуль станет доступным в рамках всей системы. Сначала путь нужно будет узнать. Для этого запустите в среде разработки интерпретатор Python:
python
Проведите импорт модуля sys:
import sys
Теперь нужно с помощью функции отобразить путь Python:
print(sys.path)
Данная команда выведет хотя бы один системный путь. Однако в среде разработки можно получить сразу несколько путей. В таком случае вам придется определять нужный. Вы сможете добавить модули в общесистемный путь Python. Для этого:
'/user/some/my_env/lib/python3.6/site-packages'
В этот каталог нужно переместить файл hello.py. Далее импортируйте модуль hello:
import hello
...
Вы увидите, что программа теперь работает без ошибок.
Опубликовано: Апрель 13, 2017
Please enable JavaScript to view the comments powered by Disqus.
sys — Системные параметры и функции — документация Python 3.8.6
Этот модуль обеспечивает доступ к некоторым переменным, используемым или поддерживаемым
интерпретатор и функции, которые сильно взаимодействуют с интерпретатором. это
всегда доступен.
-
систем.
abiflags
В системах POSIX, где Python был построен со стандартной конфигурацией
script, он содержит флаги ABI, как указано в PEP 3149 .Изменено в версии 3.8: Флаги по умолчанию стали пустой строкой (
m флаг
для pymalloc был
удалено).
-
систем.
дополнительный крючок
( крючок ) Добавить вызываемый обработчик в список активных обработчиков аудита для
текущий переводчик.Когда событие аудита вызывается функцией
sys.audit ()
, каждый
хук будет вызываться в том порядке, в котором он был добавлен, с именем события и
кортеж аргументов.Собственные хуки, добавленныеPySys_AddAuditHook ()
:
вызывается первым, а затем добавляются хуки в текущем интерпретаторе.Вызвать событие аудита
sys.addaudithook
без аргументов. Если есть
существующие хуки вызывают исключение, производное отRuntimeError
,
новый хук не будет добавлен, а исключение подавлено. Как результат,
вызывающие абоненты не могут предположить, что их ловушка была добавлена, если они не контролируют
все существующие крючки.Изменено в версии 3.8.1: Исключения, производные от
Exception
, но неRuntimeError
больше не подавляются.Детали реализации CPython: Когда трассировка включена (см.
settrace ()
), хуки Python
отслеживается, если вызываемый имеет член__cantrace__
, для которого задано значение
истинное значение. В противном случае функции трассировки пропустят ловушку.
-
систем.
argv
Список аргументов командной строки, переданных скрипту Python.
argv [0]
— это
имя скрипта (зависит от операционной системы, является ли это полным путем или
не). Если команда была выполнена с использованием параметра командной строки-c
, чтобы
интерпретатор,argv [0]
устанавливается в строку'-c'
. Если нет имени скрипта
было передано интерпретатору Python,argv [0]
— пустая строка.Чтобы перебрать стандартный ввод или список файлов, указанный на
в командной строке см. модульfileinput
.Примечание
В Unix аргументы командной строки передаются из ОС в байтах. Python декодирует
их с кодировкой файловой системы и обработчиком ошибок «surrogateescape».
Когда вам нужны оригинальные байты, вы можете получить их
[os.fsencode (arg) для arg в sys.argv]
.
-
систем.
аудит
( событие , * args ) Вызов события аудита с любыми активными хуками. Название события — строка
идентификация события и связанной с ним схемы, которая представляет собой номер и
типы аргументов.Схема для данного события считается общедоступной и
стабильный API и не должен изменяться между выпусками.Эта функция вызывает первое исключение, вызванное любой ловушкой. В основном,
эти ошибки не должны обрабатываться и должны завершать процесс как
как можно быстрее.Хуки добавляются с помощью
sys.addaudithook ()
или
PySys_AddAuditHook ()
функций.Собственный эквивалент этой функции —
PySys_Audit ()
. Используя
нативная функция предпочтительнее, когда это возможно.См. Таблицу событий аудита для всех событий, инициированных
CPython.
-
систем.
base_exec_prefix
Устанавливается во время запуска Python, до запуска
site.py
, на то же значение, что и
exec_prefix
. Если не работает в
виртуальная среда, значения останутся прежними; если
site.py
обнаруживает, что виртуальная среда используется, значения
префикс
иexec_prefix
будут изменены, чтобы указывать на
виртуальная среда, тогда какbase_prefix
и
base_exec_prefix
будет по-прежнему указывать на базовый Python
установка (та, из которой была создана виртуальная среда).
-
систем.
base_prefix
Устанавливается во время запуска Python, до запуска
site.py
, на то же значение, что и
префикс
. Если не в виртуальной среде, значения
останется прежним; еслиsite.py
обнаруживает, что виртуальная среда находится в
используйте, значения префиксаexec_prefix
будут изменены на
указывают на виртуальную среду, тогда какbase_prefix
и
base_exec_prefix
будет по-прежнему указывать на базовый Python
установка (та, из которой была создана виртуальная среда).
-
систем.
Байтердер
Индикатор собственного порядка байтов. Это будет иметь значение
'большой'
на
на платформах с прямым порядком байтов (сначала старший байт) ина «маленьких»
на
платформы с прямым порядком байтов (сначала младший байт).
-
систем.
builtin_module_names
Кортеж строк, дающий имена всех модулей, которые скомпилированы в этот
Интерпретатор Python.(Эта информация недоступна другим способом —
modules.keys ()
отображает только импортированные модули.)
-
систем.
call_tracing
( функция , аргументы ) Вызов
func (* args)
при включенной трассировке. Состояние трассировки сохраняется,
а потом восстановили. Он предназначен для вызова из отладчика из
контрольная точка, чтобы рекурсивно отлаживать другой код.
-
систем.
авторское право
Строка, содержащая информацию об авторских правах на интерпретатор Python.
-
систем.
_clear_type_cache
() Очистить кэш внутреннего типа. Кэш типов используется для ускорения атрибута
и поиск методов. Используйте функцию только , чтобы удалить ненужные ссылки
во время отладки утечки ссылок.Эта функция должна использоваться только для внутренних и специальных целей.
-
систем.
_текущие_фреймы
() Вернуть словарь, отображающий идентификатор каждого потока в самый верхний кадр стека
в данный момент активен в этом потоке на момент вызова функции. Обратите внимание, что
функции в модуле трассировки
Рамка.Это наиболее полезно для отладки тупиковой ситуации: эта функция не требует
взаимоблокированное взаимодействие потоков, и стеки вызовов таких потоков замораживаются на время
пока они остаются в тупике.Кадр, возвращенный для незаблокированного потока
может не иметь отношения к текущей активности этого потока к моменту вызова
code проверяет фрейм.Эта функция должна использоваться только для внутренних и специальных целей.
Вызывает событие аудита
sys._current_frames
без аргументов.
-
систем.
Крюк точки останова
(
.Системный модуль Python
- Подписывайтесь на нас
- Питон
- ASP.NET Core
- MVC
- IoC
- Веб-API
- C #
- TypeScript
- Node.js
- Больше
✕
. Учебники .NET
- ASP.NET Core
- ASP.NET MVC
- IoC
- веб-API
- C #
- LINQ
Учебники по скриптам
- TypeScript
- AngularJS 1
- Узел.js
- D3.js
- jQuery
- JavaScript
Другие учебные пособия
- Python
- Sass
- Https
Тесты навыков
- ASP.NET Core
- ASP.NET MVC
- LINQ
- C #
- веб-API
- IoC
- TypeScript
- AngularJS
- Node.js
- jQuery
- JavaScript
- Статьи
- Тесты
- Напишите нам
- Учебники по Python
- Python — начало работы
- Python — Обзор
- Python — настройка среды
- Python — оболочка
- Python — IDLE
- Python — редакторы
- Python — базовый синтаксис
- Python — переменные
- Python — Типы данных
- Число
- Строка
- Список
- Кортеж
- Установлен
- Словарь
- Python — Операторы
- Python — Контроль принятия решений
- Python — цикл пока
- Python — цикл For
- еще цикл
- сломать
- Продолжать
- проходить
- Python — диапазон ()
- Python — функция
- Лямбда-функция
- Python — переменная область видимости
- Python — модуль
- Атрибуты модуля
- Python — встроенные модули
- Модуль ОС
- Системный модуль
- Математический модуль
- Модуль статистики
- Модуль Коллекции
- Случайный модуль
- Python — Пакеты
- Python — Итератор
- Python — Генератор
- Python — функция карты
- Python — функция фильтра
- Python — функция сокращения
- Python — понимание списка
- Python — Рекурсия
- Python — ошибки
- Python — обработка исключений
- Python — утверждение
- Python — Класс
- частный и защищенный
- property () функция
- @property Decorator
- @classmethod Decorator
- @staticmethod Decorator
- Наследование
- Python — Магические методы
- Python — база данных CRUD
- Python — Файловый ввод-вывод
- Python — пользовательский интерфейс Tkinter
.
29,1. sys — Системные параметры и функции — документация Python 3.4.10
Этот модуль обеспечивает доступ к некоторым переменным, используемым или поддерживаемым
интерпретатор и функции, которые сильно взаимодействуют с интерпретатором. это
всегда доступен.
- sys.abiflags
В системах POSIX, где Python был построен со стандартной конфигурацией
script, он содержит флаги ABI, как указано в PEP 3149 .
- sys.argv
Список аргументов командной строки, переданных скрипту Python. argv [0] — это
имя скрипта (зависит от операционной системы, является ли это полным путем или
не). Если команда была выполнена с использованием параметра командной строки -c , чтобы
интерпретатор argv [0] устанавливается в строку ‘-c’. Если нет имени скрипта
был передан интерпретатору Python, argv [0] — пустая строка.Чтобы перебрать стандартный ввод или список файлов, указанный на
командную строку, см. модуль fileinput.
- sys.base_exec_prefix
Устанавливается во время запуска Python перед запуском site.py на то же значение, что и
exec_prefix. Если не работает в
виртуальная среда , значения останутся прежними; если
site.py обнаруживает, что виртуальная среда используется, значения
префикс и exec_prefix будут изменены, чтобы указывать на
виртуальная среда, тогда как base_prefix и
base_exec_prefix будет по-прежнему указывать на базовый Python
установка (та, из которой была создана виртуальная среда).
- sys.base_prefix
Устанавливается во время запуска Python перед запуском site.py на то же значение, что и
префикс. Если не работает в виртуальной среде , значения
останется прежним; если site.py обнаруживает, что виртуальная среда находится в
use, значения prefix и exec_prefix будут изменены на
указывают на виртуальную среду, тогда как base_prefix и
base_exec_prefix будет по-прежнему указывать на базовый Python
установка (та, из которой была создана виртуальная среда).
- sys.byteorder
Индикатор собственного порядка байтов. Это будет иметь значение «большой» на
на платформах с прямым порядком байтов (сначала старший байт) и на
платформы с прямым порядком байтов (сначала младший байт).
- sys.builtin_module_names
Кортеж строк, дающий имена всех модулей, которые скомпилированы в этот
Интерпретатор Python. (Эта информация недоступна другим способом —
модули.keys () перечисляет только импортированные модули.)
- sys.call_tracing ( функций , аргументов )
Call func (* args), когда трассировка включена. Состояние трассировки сохраняется,
а потом восстановили. Он предназначен для вызова из отладчика из
контрольная точка, чтобы рекурсивно отлаживать другой код.
- sys.copyright
Строка, содержащая информацию об авторских правах на интерпретатор Python.
- sys._clear_type_cache ()
Очистить кэш внутреннего типа. Кэш типов используется для ускорения атрибута
и поиск методов. Используйте функцию только , чтобы удалить ненужные ссылки
во время отладки утечки ссылок.Эту функцию следует использовать только для внутренних и специальных целей.
- sys._current_frames ()
Вернуть словарь, сопоставляющий идентификатор каждого потока с самым верхним кадром стека
в данный момент активен в этом потоке на момент вызова функции.Обратите внимание, что
функции в модуле трассировки могут создавать стек вызовов при таком
Рамка.Это наиболее полезно для отладки тупиковой ситуации: эта функция не требует
взаимоблокированное взаимодействие потоков, и стеки вызовов таких потоков замораживаются на время
пока они остаются в тупике. Кадр, возвращенный для незаблокированного потока
может не иметь отношения к текущей активности этого потока к моменту вызова
code проверяет фрейм.Эту функцию следует использовать только для внутренних и специальных целей.
- sys._debugmallocstats ()
Печатать низкоуровневую информацию в stderr о состоянии памяти CPython
распределитель.Если Python настроен с –с-pydebug, он также выполняет некоторые дорогостоящие
проверка внутренней согласованности.Детали реализации CPython: Эта функция специфична для CPython. Точный формат вывода не
определены здесь, и могут измениться.
- sys.dllhandle
Целое число, определяющее дескриптор библиотеки DLL Python.Доступность: Windows.
- sys.displayhook (значение , )
Если значение не равно None, эта функция печатает repr (значение) в
sys.stdout и сохраняет значение во встроенных файлах._. Если repr (значение) равно
не кодируется в sys.stdout.encoding с ошибкой sys.stdout.errors
обработчик (который, вероятно, «строгий»), закодируйте его в
sys.stdout.encoding с обработчиком ошибок ‘backslashreplace’.sys.displayhook вызывается в результате вычисления выражения
вошел в интерактивный сеанс Python.Отображение этих значений может быть
настраивается путем присвоения sys.displayhook другой функции с одним аргументом.Псевдокод:
def displayhook (значение): если значение None: возвращение # Установите '_' в None, чтобы избежать рекурсии builtins._ = Нет текст = repr (значение) пытаться: sys.stdout.write (текст) кроме UnicodeEncodeError: байты = текст.encode (sys.stdout.encoding, 'обратная косая черта') если hasattr (sys.stdout, 'buffer'): sys.stdout.buffer.write (байты) еще: текст = bytes.decode (sys.stdout.encoding, 'strict') sys.stdout.write (текст) sys.stdout.write ("\ n") builtins._ = значение
- sys.dont_write_bytecode
Если это правда, Python не будет пытаться записывать файлы .pyc или .pyo на
импорт исходных модулей. Это значение изначально установлено на True или
Неверно в зависимости от параметра командной строки -B и параметра
ПИТОНДОНТ
.
Введение в модуль Sys
Следующая глава: Python и оболочка
sys-Modul
Информация об интерпретаторе Python
Как и все другие модули, модуль sys должен быть импортирован с помощью оператора импорта, т.е.
import sys
Если есть вопросы по оператору импорта, мы рекомендуем вводную главу
наш базовый курс по этой теме
Модульное программирование и модули
Модуль sys предоставляет информацию о константах, функциях и методах языка Python.
переводчик.dir (system) дает сводку доступных констант, функций и методов.
Другая возможность — это функция help (). Использование help (sys) предоставляет ценную подробную информацию.
Модуль sys сообщает, например, о максимальной глубине рекурсии
( sys.getrecursionlimit ()
) и предоставляет возможность изменить
(sys.setrecursionlimit ())
Также доступен текущий номер версии Python:
>>> import sys >>> sys.version 2.6.5 (r265: 79063, 16 апреля 2010 г., 13:57:41) \ n [GCC 4.4.3] ' >>> sys.version_info (2, 6, 5, 'финал', 0) >>>
Аргументы командной строки
Многим скриптам нужен доступ к аргументам, переданным скрипту,
когда скрипт был запущен. argv
argv (точнее
sys.argv
) — это список, который
содержит аргументы командной строки, переданные сценарию.
Первый элемент этого списка содержит название самого скрипта. Аргументы
следуйте имени сценария.
Следующий сценарий выполняет итерацию по списку sys.argv
:
#! / usr / bin / python import sys # Конечно, этот список легко распечатать: напечатать sys.argv # или его можно повторить с помощью цикла for: для i в диапазоне (len (sys.argv)): если я == 0: print "Имя функции:% s"% sys.argv [0] еще: напечатайте "% d. аргумент:% s"% (i, sys.argv [i])
Мы сохраняем этот скрипт как arguments.py
. Если мы это назовем, то получим следующее
выход::
$ python arguments.py arg1 arg2 ['arguments.py', 'arg1', 'arg2'] Имя функции: arguments.py 1. аргумент: arg1 2. аргумент: arg2 $
Изменение поведения вывода интерактивной оболочки Python
Интерактивный режим Python — одна из вещей, которые делают Python особенным среди прочего.
языки программирования, такие как Perl или Java. Как мы видели в главе
Интерактивный режим нашего вводного урока, этого достаточно
чтобы написать выражение в командной строке и получить значимый результат.
Однако некоторые пользователи могут предпочесть другое поведение вывода.Чтобы изменить способ
интерпретатор печатает интерактивно введенные выражения, вам придется перепривязать
sys.displayhook
к вызываемому объекту.
Мы продемонстрируем это в следующем интерактивном примере сеанса:
>>> import sys >>> х = 42 >>> х 42 >>> import sys >>> def my_display (x): ... распечатка: ", ... напечатать x ... >>> sys.displayhook = my_display >>> х из: 42 >>> >>> напечатайте x 42
Из этого примера видно, что стандартное поведение функции print ()
не будет изменен.
Стандартные потоки данных
Каждый серьезный пользователь операционной системы UNIX или Linux знает стандартные потоки, т.е.
ввод, стандартный вывод и стандартная ошибка. Они известны как трубы. Они обычно
сокращенно stdin, stdout, stderr.
Стандартный ввод (stdin) обычно подключается к клавиатуре, а стандартный ввод
ошибка и стандартный вывод поступают в терминал (или окно), в котором вы работаете.
К этим потокам данных можно получить доступ из Python через объекты модуля sys с
те же имена, т.е. sys.stdin, sys.stdout и sys.stderr.
>>> import sys >>> для i in (sys.stdin, sys.stdout, sys.stderr): ... печать (я) ... ', режим' w 'в 0x7f3397a2c150> ', режим' w 'в 0x7f3397a2c1e0> >>>
В следующем примере показано использование стандартных потоков данных:
>>> import sys >>> print "Going via stdout" Переход через стандартный вывод >>> sys.stdout.write ("Другой способ! \ n") Другой способ сделать это! >>> x = raw_input ("прочитать значение через stdin:") прочитать значение через stdin: 42 >>> напечатайте x 42 >>> print "введите значение:",; sys.stdin.readline () [: - 1] введите значение: 42 '42' >>>
В следующем примере объединены ввод и вывод:
import sys в то время как True: # вывод на стандартный вывод: print "Еще одна итерация ..." пытаться: # чтение из sys.stdin (остановить Ctrl-D): number = raw_input ("Введите число:") кроме EOFError: печать "\ nciao" сломать еще: число = int (число) если число == 0: print >> sys.stderr, "0 не имеет обратного" еще: print "инверсия% d -% f"% (число, 1.0 / число)
Если мы сохраним предыдущий пример в «streams.py» и воспользуемся файлом с именем
«number.txt» с числами (по одному в строке) для ввода,
мы можем вызвать скрипт из оболочки Bash следующим образом:
$ python streams.py Также возможно перенаправить вывод в файл:$ python streams.py output.txtТеперь в оболочке останется только следующий вывод:
0 не имеет обратногопотому что это происходит через поток sterr.
Перенаправления
Вряд ли найдется пользователь Linux или Unix Shell, например.г. Bourne или Bash Shell, которые не
использовали перенаправление ввода или вывода. Не будет преувеличением сказать, что полезная работа не
возможно без перенаправлений.Стандартный вывод (stdout) может быть перенаправлен, например в файл, чтобы мы могли
позже обработайте этот файл другой программой. То же самое возможно и со стандартным потоком ошибок,
мы также можем перенаправить его в файл. Мы можем перенаправить как stderr, так и stdout в один файл
или в отдельные файлы.Следующий сценарий не требует пояснений.Но все же вот некоторые пояснения:
Первый оператор использует обычный стандартный вывод
(stdout), т.е. текст "Coming through stdout" будет напечатан в терминале, из которого
сценарий был вызван. В следующей строке мы сохраняем стандартный выходной канал в
переменная save_stdout, так что мы сможем восстановить исходное состояние позже
в сценарии. После этого открываем для записи файл «test.txt». После заявления
sys.stdout = fh
все операторы печати будут напрямую печататься в этом файле.Оригинал
состояние восстанавливается с помощьюsys.stdout = save_stdout
.import sys print ("Проходит через стандартный вывод") # стандартный вывод сохранен save_stdout = sys.stdout fh = open ("test.txt", "w") sys.stdout = fh print ("Эта строка идет в test.txt") # вернуться в нормальное состояние: sys.stdout = save_stdout fh.close ()В следующем примере показано, как перенаправить стандартный поток ошибок в файл:
import sys save_stderr = sys.stderr fh = open ("errors.txt", "w") sys.stderr = fh х = 10/0 # вернуться в нормальное состояние: sys.stderr = save_stderr fh.close ()Возможна запись в поток ошибок напрямую, т.е. без изменения общего вывода
поведение. Это может быть достигнуто путем добавления>> sys.stderr
к оператору печати.import sys save_stderr = sys.stderr fh = open ("errors.txt", "w") sys.stderr = fh print >> sys.stderr, "печать в error.txt" # вернуться в нормальное состояние: sys.stderr = save_stderr fh.close ()Другие интересные переменные и константы в модуле sys
Имя | Описание | |
---|---|---|
Байтердер | Индикатор собственного порядка байтов. Следующий вывод был создан на машине Linux и Python 2.6.5: >>> sys.byteorder 'немного' >>> Значение будет ‘большим’ на платформах с прямым порядком байтов (сначала старший байт), и | |
исполняемый файл | Строка, содержащая имя исполняемого двоичного файла (путь и имя исполняемого файла) для интерпретатора Python. Например. «c: \\ Python31 \\ python.exe в Windows 7 или» / usr / bin / python «в Linux. >>> sys.executable '/ usr / bin / python' | |
макс. | Этот атрибут содержит наибольшее положительное целое число, поддерживаемое Python обычный целочисленный тип. Минимальное значение для максимального целочисленного значения — не менее 2 31-1 . - maxint - 1 . Замечание относительно Python 3.X: | |
макс. Размер | ||
maxunicode | Целое число, дающее наибольшую поддерживаемую кодовую точку для Символ Юникода. Значение этого параметра зависит от параметра конфигурации, который указывает хранятся ли символы Unicode как UCS-2 или UCS-4. | |
модулей | Значение sys.modules — словарь, отображающий имена модулей. модулям, которые уже были загружены. Этим можно манипулировать, например, чтобы заставить перезагрузить модули. Обратите внимание, что удаление модуля из этого словаря — это не то же самое, что вызов reload (). на соответствующем модульном объекте. | |
путь | Содержит поисковый запрос, в котором Python ищет модули.>>> sys.path ['', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/python2.6/dist-packages/gst-0.10', '/usr/lib/pymodules/python2.6', '/usr/lib/python2.6/dist-packages/gtk-2.0', '/ usr / lib / pymodules / python2.6 / gtk-2.0 ',' /usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode ', '/usr/local/lib/python2.6/dist-packages'] >>> | |
платформа | Имя платформы, на которой работает Python, например. «linux2» для Linux и win32 для Windows >>> sys.platform linux2 >>> | |
версия | Номер версии интерпретатора Python>>> sys.version '2.6.5 (r265: 79063, 16 апреля 2010 г., 13:57:41) \ n [GCC 4.4.3] ' >>> | |
version_info | Информация аналогична sys.version, но на выходе получается кортеж содержащий пять компонентов номера версии: основной, дополнительный, микро, уровень выпуска и серийный. Значения этого кортежа являются целыми, за исключением значения уровня выпуска, которое является одним из следующие: «альфа», «бета», «кандидат» или «финал». >>> sys.version_info (2, 6, 5, 'финал', 0) >>> | |
__stdin__ __stdout__ __stderr__ | Эти атрибуты содержат исходные значения stdin, stderr и stdout в начале программы.Их можно использовать для печати в фактический стандартный поток независимо от того, Объект sys.std * был перенаправлен. Их также можно использовать для восстановления самих файлов. к известным рабочим файловым объектам, если они были перезаписаны поврежденным объектом. Но вместо использования этих значений исходный поток всегда следует явно сохранять в переменная (как показано в наших предыдущих примерах) перед ее заменой, а исходное состояние должно быть восстановленным с помощью сохраненного объекта. | |
getrecursionlimit () setrecursionlimit (limit) | getrecursionlimit () возвращает текущее значение лимита рекурсии, максимальная глубина стека интерпретатора Python.Этот предел предотвращает бесконечная рекурсия из-за переполнения стека C и сбой Python. >>> sys.getrecursionlimit () >>> 1000 setrecursionlimit (limit) устанавливает максимальную глубину стека интерпретатора Python равной значению |
Следующая глава: Python и оболочка
.