No Image

Python sys stdin пример

СОДЕРЖАНИЕ
5 просмотров
10 марта 2020

Модуль 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 наименование. В зависимости от платформы, на которой вы работаете, первый аргумент может содержать полный путь к скрипту или к названию файла. Для дополнительных деталей обратитесь к документации. А тем временем, попробуем поработать с парочкой примеров, чтобы познакомиться с этим инструментом:

Если вы запустите это в интерпретаторе, вы получите список с пустой строкой. Давайте создадим файл под названием sysargv.py, со следующим содержимым:

Теперь запустите код в IDLE. Вы увидите список с одним элементом, который содержит путь к вашему скрипту. Попробуем передать скрипту несколько аргументов. Откройте окно терминала консоли и при помощи команды cd измените каталоги на тот, в котором находится скрипт. После этого, запустите что-то наподобие этого:

Обратите внимание на то, что будет выведено на экран:

Первый аргумент – это название файла нашего скрипта. Следующие два аргумента в списке – это те, что мы передали нашему скрипту в командной строке.

sys.executable

Значение sys.executable – это полный путь к интерпретатору Python. Это очень полезно, когда вы используете чей-то компьютер, и вам нужно узнать, где установлен Python. В некоторых системах, данная команда не сработает, и выдаст пустую строку с надписью None. Посмотрим, как пользоваться этой функцией:

sys.exit

Данная функция позволяет разработчику выйти из Python. Функция exit принимает необязательный аргумент, обычно целое число, которое дает статус выхода. Ноль считается как успешное завершение. Обязательно проверьте, имеет ли ваша операционная система какие-либо особые значения для своих статусов выхода, чтобы вы могли следить за ними в своем собственном приложении. Обратите внимание на то, что когда вы вызываете exit, это вызовет исключение SystemExit, которое позволяет функциям очистки работать в конечных пунктах блоков try / except. Давайте взглянем на то, как вызывается данная функция:

" , line 1 , in module >

Запустив данный код в IDLE, вы увидите возникшую ошибку SystemExit. Давайте создадим несколько скриптов для теста. Для начала вам нужно создать основной скрипт, программу, которая будет вызывать другой скрипт Python. Давайте назовем его “call_exit.py”. Скрипт должен содержать следующее:

Теперь создайте скрипт Python под названием“exit.py” и сохраните его в той же папке. Вставьте в него следующий код:

Теперь давайте запустим его:

Как вы могли заметить, написанный нами скрипт exit вернул ноль, так что он успешно заработал. Получается, мы заодно научились вызывать разные скрипты Python изнутри самого Python!

sys.path

Значение функции path модуля sys – это список строк, которые указывают путь поиска для модулей. Как правило, данная функция указывает Python, в каких локациях смотреть, когда он пытается импортировать модуль. В соответствии с документацией Python, sys.path инициализируется из переменной окружения PYTHONPATH, плюс зависимое от установки значение, указанное по умолчанию. Давайте взглянем на пример:

Читайте также:  Как проверить айфон если покупаешь с рук

Данная функция может быть весьма полезной во время отладки причины, по которой модуль не импортируется. Вы также можете изменить путь. Так как данная функция является путем, мы можем добавлять или удалять путь из неё. Давайте взглянем на то, как добавлять путь:

Удаление пути я оставлю как задание для читателя

sys.platform

Значение sys.platform – идентификатор платформы. Вы можете использовать sys.platform чтобы добавлять модули к sys.path, импортировать разные модули, в зависимости от платформы, или запускать разные части кода. Давайте взглянем:

В данном примере мы видим, что Python работает в Windows. Вот пример того, как мы можем воспользоваться данной информацией:

Данный код показывает способы проверки того, используем ли мы определенную операционную систему. Если мы используем 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, как получить информацию о платформе, работать с аргументами, переданными командной строке, и многому другому.

В задаче (кроме самого алгоритма решения) необходимо реализовать прием данных через stdin , а вывод через stdout . До этого обычно реализовывал прием через input , а вывод через print или просто возвращал значение без печати через return . Как принять данные с помощью stdin / stdout не улавливаю. Огромная просьба, дать ссылку или пример кода, чтобы разобраться.

2 ответа 2

По умолчанию input() читает данные из stdin , print() печатает данные в stdout . Так что можете считать вашу задачу решённой.

Я пытаюсь выполнить некоторые из code golf, но все они требуют ввода, который нужно взять из stdin . Как я могу получить это в Python?

Вы можете использовать модуль fileinput :

fileinput будет проходить по всем строкам ввода, указанным как имена файлов, заданные в аргументах командной строки, или стандартный ввод, если аргументы не предоставлены.

Примечание: line будет содержать завершающий символ новой строки; чтобы удалить его используйте line.rstrip()

Есть несколько способов сделать это.

sys.stdin – это файл-подобный объект, на котором вы можете вызывать функции read или readlines если вы хотите прочитать все или хотите все прочитать и разделить на новую строку автоматически. (Для этого вам нужно import sys .)

Читайте также:  Как лучше подключить динамики

Если вы хотите raw_input пользователя для ввода, вы можете использовать raw_input в Python 2.X и просто input в Python 3.

Если вы просто хотите прочитать параметры командной строки, вы можете получить к ним доступ через список sys.argv.

Вы, вероятно, найдете эту статью в Википедии о вводе-выводе в Python также полезной ссылкой.

Обратите внимание, что в конце будет добавлен символ новой строки. Чтобы удалить перевод строки в конце, используйте line.rstrip() , как сказал @brittohalloran.

Python также имеет встроенные функции input() и raw_input() . См. Документацию Python в Встроенные функции.

В Unix вы можете проверить его, выполнив что-то вроде:

В Windows или DOS вы должны:

Ответ, предложенный другими:

очень прост и pythonic, но следует отметить, что script будет ждать до EOF перед началом итерации по строкам ввода.

Это означает, что tail -f error_log | myscript.py не будет обрабатывать строки, как ожидалось.

Правильный script для такого варианта использования:

UPDATE
Из комментариев было очищено то, что на python 2 может быть только буферизация, так что вы в конечном итоге ожидаете заполнения буфера или EOF до того, как выйдет запрос на печать.

Как вы читаете со стандартного ввода в Python?

Я пытаюсь выполнить некоторые задачи кода, но все они требуют ввода от stdin. Как мне получить это в Python?

Вы можете использовать:

  • sys.stdin – Файловый объект – вызовите sys.stdin.read() , чтобы прочитать все.
  • input(prompt) – передать ему необязательный запрос на вывод, он читает от стандартного ввода до первой новой строки, которую удаляет. Вам придется делать это несколько раз, чтобы получить больше строк, в конце ввода это вызывает EOFError. (Вероятно, не подходит для игры в гольф.) В Python 2 это rawinput(prompt) .
  • open(0).read() – В Python 3 встроенная функция open принимает файловые дескрипторы (целые числа, представляющие ресурсы ввода-вывода операционной системы), а 0 – дескриптор stdin . Он возвращает файл-подобный объект, такой как sys.stdin – вероятно, ваш лучший выбор для игры в гольф. В Python 2 это io.open .
  • open(‘/dev/stdin’).read() – аналогично open(0) , работает на Python 2 и 3, но не на Windows (или даже Cygwin).
  • fileinput.input() – возвращает итератор над строками во всех файлах, перечисленных в sys.argv[1:] , или stdin, если не указан. Используйте как ”.join(fileinput.input()) .

И sys , и fileinput должны быть импортированы соответственно.

Быстрые примеры sys.stdin , совместимые с Python 2 и 3, Windows, Unix

Вам просто нужно read из sys.stdin , например, если вы передаете данные в stdin:

Мы видим, что sys.stdin находится в текстовом режиме по умолчанию:

пример файла

Скажем, у вас есть файл, inputs.txt , мы можем принять этот файл и записать его обратно:

Более длинный ответ

Здесь полная, легко воспроизводимая демонстрация с использованием двух методов: встроенной функции, input (используйте raw_input в Python 2) и sys.stdin . Данные не изменены, поэтому обработка не является операцией.

Читайте также:  Что такое clean master

Для начала давайте создадим файл для ввода:

И используя код, который мы уже видели, мы можем проверить, что создали файл:

Вот справка по sys.stdin.read из Python 3:

Встроенная функция, input ( raw_input в Python 2)

Встроенная функция input считывает со стандартного ввода до новой строки, которая удаляется (дополняет print , который по умолчанию добавляет новую строку.) Это происходит до тех пор, пока не получит EOF (конец файла), после чего она поднимается EOFError .

Таким образом, вот как вы можете использовать input в Python 3 (или raw_input в Python 2) для чтения из stdin – поэтому мы создаем модуль Python, который мы называем stdindemo.py:

И давайте распечатаем его обратно, чтобы убедиться, что мы ожидаем:

Опять же, input читает до новой строки и по существу удаляет его из строки. print добавляет новую строку. Поэтому, пока они оба изменяют ввод, их модификации отменяются. (Так что они по сути друг друга дополняют.)

И когда input получает символ конца файла, он вызывает EOFError, которую мы игнорируем, а затем выходим из программы.

А в Linux/Unix мы можем передать из cat:

Или мы можем просто перенаправить файл из стандартного ввода:

Мы также можем выполнить модуль как скрипт:

Вот справка по встроенному input из Python 3:

sys.stdin

Здесь мы создаем демонстрационный скрипт, используя sys.stdin . Эффективный способ перебора файловоподобного объекта заключается в использовании файловоподобного объекта в качестве итератора. Дополнительный метод записи в стандартный вывод этого ввода – просто использовать sys.stdout.write :

Распечатайте его обратно, чтобы убедиться, что он выглядит правильно:

И перенаправить ввод в файл:

Гольф в команде:

Файловые дескрипторы для игры в гольф

Поскольку файловые дескрипторы для stdin и stdout равны 0 и 1 соответственно, мы также можем передать их в open в Python 3 (не в 2, и обратите внимание, что нам все еще нужен ‘w’ для записи в stdout).

Если это работает в вашей системе, это сбрит больше символов.

Python 2 io.open также делает это, но импорт занимает гораздо больше места:

Обращение к другим комментариям и ответам

Один комментарий предлагает ”.join(sys.stdin) для игры в гольф, но на самом деле он длиннее, чем sys.stdin.read() – плюс Python должен создать дополнительный список в памяти (то, как работает str.join , когда нет списка) – для контраста:

Верхний ответ предполагает:

Но, поскольку sys.stdin реализует файловый API, включая протокол итератора, он такой же, как и этот:

Другой ответ подсказывает это. Просто помните, что если вы делаете это в интерпретаторе, вам нужно сделать Ctrl – d , если вы работаете в Linux или Mac, или Ctrl – z в Windows (после Enter ), чтобы отправить символ конца файла процессу. Кроме того, в этом ответе предлагается print(line) – который добавляет ‘
‘ к концу – используйте вместо него print(line, end=”) (если в Python 2 вам понадобится from __future__ import print_function ).

Реальный вариант использования fileinput предназначен для чтения в серии файлов.

Комментировать
5 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
Adblock detector