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

Набор инструментов для сценариев Python: SYS и FileInput

Часть 1 из 3. Несколько способов усилить ваши сценарии Python со стандартной библиотекой. Tagged с питоном, сценарием, учебником.

Набор инструментов для сценариев Python (серия 3 деталей)

Фотография обложки Флера Треернеет на Unsplash

Python – это чрезвычайно гибкий язык с использованием в тоннах различных приложений и полей: веб -приложения, автоматизация, наука и анализ данных, чтобы назвать несколько. Однако мой Любимый То, что можно использовать для его сценариев. Сценарии могут быть такими же просты Немного пользовательского интерфейса.

К счастью для нас, у Python уже есть много предметов первой необходимости для сценариев в его стандартной библиотеке! Я собираюсь показать вам несколько функций, которые мне нравятся больше всего и как они используются. Я буду использовать Python 3.6 для всех этих примеров. Большинство вещей должны работать в любом Python 3. Ваш пробег может варьироваться, если вы используете Legacy Python (Python 2).

Я знаю, что есть библиотеки и структуры для создания интерфейсов командной строки. Они замечательные. В этой статье я собираюсь сосредоточиться на «батареях» Python: Стандартной библиотеке. Я покажу вам, сколько вы можете достичь, не установив ни одной внешней зависимости.

Настройка

Это будет обследование инструментов, доступных нам для сценариев Python. Я демонстрирую функциональность, создав три сценария, которые демонстрируют разные части стандартной библиотеки.

  1. shout.py : Сценарий, который кричит все, что вы передаете в него.
  2. make_script.py : Сценарий, который генерирует стартовый скрипт из шаблона, для использования в таких вещах, как Проект Euler или Rosalind Анкет
  3. project_setup.py : Сценарий, который создает базовый проект скелета

Это здесь часть. Теперь давайте начнем.

Скрипт 1: крик

Вы когда -нибудь хотели, чтобы ваш компьютер крикнул на вас больше? Или что вы, компьютер, был более абразивным? Тогда вам повезло, потому что мы собираемся исправить все это. Создайте новый файл с именем shout.py Анкет Сначала мы собираемся просто заполнить базовую функциональность, а затем создать оттуда интерфейс.

#!/usr/bin/env python
"""Takes in input and returns that same input, but uppercase."""

def shout(text):
    return text.upper()

До сих пор хорошо! Я хотел, чтобы все было проще начать, чтобы мы могли сосредоточиться в основном на нашем наборе инструментов. Прямо сейчас, если вы запускаете Python Shout.py , это ничего не делает. Давайте исправим это. Но как получить доступ к аргументам, предоставленным нашим сценариям? Наш первый инструмент: Sys Анкет Sys является модулем, который обрабатывает множество различных вариантов и значений на уровне системного уровня, или значений, специфичных для питона. Вы можете использовать его, чтобы проверить, какую версию Python Comomen использует, какую операционную систему работает сценарий, или (для чего мы его используем) получить доступ к stdin В stdout и аргументы командной строки.

Использование sys.argv

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

#!/usr/bin/env python3
"""Takes in input and returns that same input, but uppercase."""

import sys

def shout(text):
    return text.upper()

if __name__ == "__main__":
    text = sys.argv[1]
    print(shout(text))

argv является массивом аргументов (разделенных пространством), которые были переданы нашему сценарию. Обратите внимание, что argv [0] это название сценария, который был запущен. Запустив это, результат будет:

$ python3 shout.py banana
BANANA

Это работает нормально для некоторых вещей. Если бы у нас был сценарий, который рассчитывал площадь многоугольника на основе количества сторон и длины боковой ( например, Python polygonarea.py 5 20 ), Аргв было бы именно то, что приказал Доктор. Но в этом случае было бы полезно иметь возможность передать вещи в наш сценарий через stdin , как и любая другая команда оболочки. К счастью, Sys Еще раз есть наша спина!

Использование sys.stdin и sys.stdout

#!/usr/bin/env python3
"""Takes in input and returns that same input, but uppercase."""

import sys

def shout(text):
    return text.upper()

if __name__ == "__main__":
    text = sys.stdin.read()
    sys.stdout.write(shout(text))

Sys Модуль обеспечивает ручки stdin В stdout и Stderr , который вы можете читать и писать, соответственно, как и любой другой объект типа файла. Теперь найдите текстовый файл или создайте один с несколькими строками, и запустите свой код таким образом:

$ cat test.txt | python3 shout.py
BANANA OONANA
I GAVE MY HEART TO A BANANA
MY HEART TO A BANANA.
BANANA OONANA!

Прошу прощения за все «банановые». У меня есть эта песня застрял в моей голове. Но питоны прохладные, верно? Есть еще одно улучшение, которое мы можем сделать здесь. Что, если наш текст, который мы хотим кричать, был действительно, Действительно длинная? Было бы лучше обрабатывать линию по линии, верно? Таким образом, мы могли бы видеть частичные выходы по мере его обработки, и нам не нужно беспокоиться о чтении всего файла в память. Вот что так здорово stdin а также stdout быть «файловыми объектами». У них есть те же методы, что и обычные файлы. Это означает, что мы можем повторить линии stdin в для петля!

# ...
if __name__ == "__main__":
    for line in sys.stdin:
        sys.stdout.write(shout(line))

На этот раз, когда вы запустите его, вы не заметите никакой разницы. Давайте поместим задержку между каждой строкой.

#!/usr/bin/env python3
"""Takes in input and returns that same input, but uppercase."""

import sys
from time import sleep

def shout(text):
    return text.upper()

if __name__ == "__main__":
    for line in sys.stdin:
        sys.stdout.write(shout(line))
        sleep(3)

Когда вы запускаете его на этот раз, строки должны выходить медленно, тогда как старая версия будет происходить одновременно, несмотря ни на что!

Использование FileInput

Что, если вы хотите по -настоящему выйти наверх с этим инструментом кричания? Вы хотели иметь возможность кричать сразу целую кучу файлов вместе с трубопроводом из stdin ? Вы бы хотели FileInput . Проверьте это.

#!/usr/bin/env python3
"""Takes many inputs and returns that same input, but uppercase."""

import fileinput
import sys

def shout(text):
    return text.upper()

if __name__ == "__main__":
    for line in fileinput.input():
        sys.stdout.write(f"({ fileinput.filename() }) - { shout(line) }")

Теперь создайте второй файл ( test2.txt ). Запустите сценарий так:

$ python3 shout.py test.txt test2.txt
(test.txt) - BANANA OONANA
(test.txt) - I LEFT MY HEART INSIDE BANANAS
(test.txt) - INSIDE BANANAS.
(test.txt) - BANANAS OONANANA!
(test2.txt) - THIS IS THE SECOND FILE.
(test2.txt) - IT IS LAMER.
(test2.txt) - NOT AS CATCHY OF TEXT.
(test2.txt) - HELLO.

FileInput использует вход Функция объединить все аргументы имени файла и прочитать их как один поток по линии. Он имеет дополнительные полезные функции, которые вы можете позвонить во время чтения, чтобы добавить дополнительную информацию. Мы использовали его, чтобы предоставить имя файла обрабатываемого, но есть больше, например льна , Филиньено , isfirstline и Isstdin . Вы даже можете добавить дополнительные параметры, чтобы изменить входные файлы на месте, создать резервное копирование измененных файлов на месте, декомпрессируемых сжатых файлов и многого другого!

Но подождите минуту. Это действительно круто, но вы обещали, что мы все еще можем использовать stdin с этим методом. Как это работает?

Вы можете включить stdin В вашем списке файлов с помощью одной черты ( - ).

echo "whaddup from stdin" | python3 shout.py test.txt - test2.txt
(test.txt) - BANANA OONANA
(test.txt) - I LEFT MY HEART INSIDE BANANAS
(test.txt) - INSIDE BANANAS.
(test.txt) - BANANAS OONANANA!
() - WHADDUP FROM STDIN
(test2.txt) - THIS IS THE SECOND FILE.
(test2.txt) - IT IS LAMER.
(test2.txt) - NOT AS CATCHY OF TEXT.
(test2.txt) - HELLO.

Все кричали

Вот и все для система , FileInput и наш shout.py сценарий Оставайтесь с нами для следующей части, где мы построим make_script.py – Мы напишем сценарий, который пишет сценарии, чтобы мы могли сценарий, пока наш сценарий сценариев. Увидимся в следующий раз!

Первоначально опубликовано Assert_not Magic?

Набор инструментов для сценариев Python (серия 3 деталей)

Оригинал: “https://dev.to/rpalo/python-scripting-toolbox-sys-and-fileinput-3aob”