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

Python для Bash

Как я положил радость обратно в написание сценариев. Теги с Python, терминалом, учебником.

Это было первоначально опубликовано на моем блог .

Вам нравится Bash Скрипты? Лично я не.

Поэтому, когда мне нужно писать сценарии Bash, я выяснил команды, которые мне нужны, затем клея их вместе с Python.

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

Быстрое вступление в подпроцесс Python .py

Среда разработки

Если вы следуете вместе со мной здесь, вы захотите использовать хотя бы Python 3.5 Отказ Любая версия до этого, и вам придется использовать другой API в этом модуле, чтобы сделать то, что я покажу вам.

Команда

Workhorse этого модуля является подпрокат. Popen класс. Существует тонна аргументов, вы можете пройти этот класс, но он может быть подавляющим – и не говоря уже о чрезвычайных ситуациях – если вы новичок в этом.

К счастью, есть функция в подпрокат Модуль, с которым мы можем взаимодействовать вместо этого: subprocess.run () Отказ

Вот функциональная подпись с некоторыми типичными аргументами. (Я вытащил это из Документы )

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None,
shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None,
text=None, env=None)*)

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

Основной пример

import subprocess as sp

result = sp.run("pwd")
print(result)

Выход:

/this/is/the/path/to/where/my/terminal/was/
CompletedProcess(args="pwd", returncode=0)

Выход этого является путь к каталогу, от которого вы запустили этот скрипт; именно то, что вы ожидаете. Тогда есть некоторые Завершена доставка объект. Это просто объект, который хранит некоторую информацию о команде, которая была запущена. Для этого руководства я его игнорирую, но у меня будет ссылки в конце, где вы можете прочитать все об этом.

Но это так! Это все, что вам нужно запустить некоторые основные Bash команды. Единственное оговорку в том, что вам не хватает некоторых особенностей оболочки.

Чтобы преодолеть это, давайте посмотрим на следующий пример.

Лучший пример

import subprocess as sp

result = sp.run("ls -lah > someFile.txt", shell=True)
output = sp.run('ls -lah | grep ".txt"', shell=True)

Возможно, вы заметили ранее в подписи функции, что оболочка = Ложь С Но здесь я поставил это на Правда Отказ При этом команда, которую я хочу, фактически бегает в оболочке. Это означает, что у меня есть доступ к перенаправлению и трубам, как я показал.

Примечание на беговых вещах, подобных этой: команда, которую вы хотите выполнить, должны быть напечатаны именно так, как вы бы делаете это на оболочке. Если вы прочитаете документацию, вы заметите, что есть способ запуска команд, проходящих в списке строк, где каждая строка – это либо команда, либо флаг, либо ввод в основную команду.

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

Вот пример мне делать только это.

Пример «реального мира»

#!/usr/bin/env python3

###############################################################################
#                                   Imports                                   #
###############################################################################
import subprocess as sp
from datetime import date

###############################################################################
#                                  Functions                                  #
###############################################################################

def getTodaysDate():
  currDate = date.today()
  return f"{currDate.year}-{currDate.month}-{currDate.day}"

def moveToPosts():
  lsprocess = sp.run("ls ./_drafts", shell=True)
  fileList = lsprocess.stdout.decode('utf-8').strip().split("\n")
  hasNewPost = len(fileList)

  if (hasNewPost == 1):
      print("New post detected")

      srcName = "./_drafts/" + fileList[0]
      destName = " ./_posts/" + getTodaysDate() + "-" + fileList[0]

      command = "mv "+ srcName + destName
      sp.run(command, shell=True)

      return [destName, files[0]]

  elif hasNewPost == 0:
      print("Write more!")
  else:
      print("Too many things, not sure what to do")

def runGit(fullPath, fileName):

  commitMsg = "'Add new blog post'"

  c1 = "git add " + fullPath
  c2 = "git commit -m " + commitMsg

  cmds = [c1,c2]

  for cmd in cmds:
    cp = sp.run(cmd, shell=True)

if __name__ == "__main__":
  pathToPost, fileName = moveToPosts()
  runGit(pathToPost, fileName)
  print("Done") 

Поскольку этот блог работает благодаря Jekyll, я воспользовался …| _drafts Папка доступна для меня.

Для тех из вас не знаком с Джекиллом, _drafts Это папка, в которой вы можете хранить сообщения в блоге, которые еще не готовы публиковать. Опубликованные сообщения Go в _Posts Отказ

Имены имена в этой папке выглядят: the-title-of-my-post.md Отказ Имена файлов для опубликованного поста, которая сидит в _Posts Папка имеет то же имя, но с Год месяц - День- прикреплен к передней части чернового имени.

С этим скриптом я просто должен написать сообщение и бросить его в _Черновики . Затем я открываю терминал и запустил этот скрипт. Сначала это выглядит в _drafts и делает массив файлов, которые она найдена. Что-нибудь, кроме как только нахождение одного файла, остановит сценарий Я улучшу этот день. С этим именем файла и помощь subprocess.run () Сценарий перемещает черновик в _Posts дает это подходящее название, а затем совершает его на Гит для меня.

Заворачивать

Я представил subprocess.run () Функция, дала 3 примера бега Bash Команды с этим и закончились сценарием, который вдохновил этот пост в первую очередь.

У меня лично нет слишком много использования для Bash сценарии. Когда мне нужно, хотя, я обязательно пишу его в Python, и если это подходит вам, вы должны тоже.

Дальнейшее чтение

Оригинал: “https://dev.to/_andy_lu_/python-for-bash-3798”