Это было первоначально опубликовано на моем блог .
Вам нравится 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”