Як замінити Bash на Python як мову переходу до командного рядка

У мене трохи стосунки любові і ненависті з Башем. Я проводжу багато часу в терміналі, і bash - це моя мова програмування за замовчуванням. Іноді я кажу людям, що find, grep і xargs керують їхньою інфраструктурою, і вони сміються і сміються, поки не зрозуміють, що я серйозно.

Підібрати Python - ідеальний вибір для системних адміністраторів. Це також чудово для тих, хто має справу з чимось у терміналі, але не хоче використовувати bash або має потреби, які занадто складні для bash. Як тільки завдання виходить за рамки

find $(pwd) -name "*.txt" | xargs -I {} echo "do stuff with {}"

настав час зламати Python!

Використання Python як переходу до мови командного рядка має багато переваг.

  • У Python є безліч приємних бібліотек, які можуть допомогти майже будь-чим. Це включає роботу з системними операціями, читання файлів, перелік каталогів, написання циклів, перевірку кодів виходу тощо.
  • Автозаповнення IDE. Серйозно. Хто хоче щось запам’ятати?
  • Надійний пакет тестування, якщо це ваша річ (а якщо ні, вам слід подумати, щоб зробити це своєю справою).
  • Консоль iPython. Це прекрасно. Це дивовижно. Я ЦЕ ЛЮБЛЮ.
  • Python доступний у більшості систем, і якщо це не так, ви можете отримати його за допомогою Miniconda.
  • Надійна перевірка помилок за допомогою блоків try and catch.
  • Якщо ви працюєте в різних операційних системах, ви можете використовувати бібліотеки Python, які матимуть справу з усім цим.
  • Навіть якщо у вас немає можливостей програмування, Python - це проста мова, з якої можна розпочати.

Давайте розпочнемо

Для початку спочатку вам потрібно встановити Python або встановити його за допомогою Miniconda.

Перевірте, чи встановлено iPython

which python which ipython 

Якщо обидва вони успішні, ви займаєтеся бізнесом! Якщо у вас є Python, але не iPython, вам доведеться його встановити. Ви можете встановити його як системний пакет, але я справді рекомендую вам просто встановити його за допомогою Miniconda.

Встановіть Miniconda

Візьміть тут програму встановлення для вашої ОС. Я пропоную отримати установку Python3.

Тоді це просто проста установка.

bash Miniconda3-latest-Linux-x86_64.sh 

Дотримуйтесь підказок, і ви встановите Miniconda3. Після його встановлення ви захочете запустити оновлення, оскільки це технологія, і, звичайно, ви хочете запустити оновлення. ;-)

conda update conda conda config --add channels conda-forge conda update -y --all conda install -y ipython 

Вирішення проблем

Якщо у вас виникли проблеми з установкою будь-яких пакунків, ось кілька порад.

  • Запустіть conda clean --allі спробуйте ще раз.
  • Переконайтеся, що ви використовуєте правильний канал.
  • Біжи conda update -y --all
  • Намагайтеся якомога менше інсталювати ваш глобальний конда-простір. Натомість створюйте середовища для різних завдань та проектів, до яких ми займемось далі.

Створюйте середовища за допомогою Conda

Якщо ви коли-небудь використовували virtualenv, pipenv (це річ?), Rbenv, plenv, anyenv або будь-яку іншу різноманітну програму env, яка з’являлася протягом багатьох років, це здаватиметься вам дуже знайомим. Ідея полягає в тому, що різні проекти повинні мати свої власні ізольовані програмні середовища.

conda create -n my-project ipython package1 package2 package2 

Якщо ви схожі на мене і хочете, щоб iPython був легко доступний, переконайтеся, що ви встановили його в будь-яке нове середовище!

Бібліотеки Python для системного адміністрування

Перш ніж перейти до прикладів, давайте просто перелічимо кілька корисних пакетів разом з їх документами.

Мій пакет переходу - це пакет os. Ви можете використовувати його для переліку каталогів, перевірки наявності файлів, перевірки наявності символічних посилань, створення каталогів, запуску системних команд, отримання та встановлення змінних середовища тощо. Це чудово!

Мій другий пакет для запуску системних команд, які не існують як зручні бібліотеки python, - це модуль підпроцесу.

У shutil є файлові операції, яких немає в бібліотеці os.

Бібліотека pprint друкує складні структури даних з гарним відступом.

Бібліотека pytest дозволить вам протестувати свій код Python, тому що, погодьтеся, ніколи ніколи нічого не працює коректно перші (кілька) разів.

Як мені виконати свій код?

Нарешті! Код!

Знімок екрана-2019-12-13-10.33.52

Коли ви використовуєте Python для системного адміністрування, ви можете зануритися прямо в консоль iPython або написати сценарії, а потім виконати їх за допомогою python name-of-script.py.

Якщо ви віддаєте перевагу писати свої сценарії, у вас так багато можливостей, і це справді питання особистих переваг. Я використовую платну програму PyCharm, але Visual Studio Code і Atom - однаково відмінні безкоштовні рішення.

Я вважаю, що це залежить від того, над чим я працюю. Іноді я просто відкриваю консоль iPython і починаю друкувати, а інший раз мені потрібно щось більш надійне з тестами та чим завгодно.

Якщо ви використовуєте або консоль iPython, або будь-який з перелічених вище редакторів, у вас буде автозаповнення. Автозаповнення - це чудово! За допомогою iPython просто починайте вводити свою функцію та натисніть вкладку, щоб отримати список потенційних функцій, які вам можуть знадобитися.

Знімок екрана-2019-12-13-10.49.07

Я не можу висловити, як сильно я люблю автозаповнення. ;-)

Отримати допомогу

Ви можете перейти на будь-яку сторінку документації для будь-якої бібліотеки, але якщо ви знаєте назву будь-якої бібліотеки або функції, ви можете створити її в iPython.

Знімок екрана-2019-12-13-10.55.14

Знімок екрана-2019-12-13-10.55.55

You can bring up the help menu in most IDEs and text editors too, but that will be specific to your editor.

Examples

First you will need to import your packages

import os import subprocess import shutil from pprint import pprint 

Here are some examples of common file and directory operations.

# Get your current working directly # This returns a string my_cwd = os.getcwd() print(my_cwd) 
# List the contents of a directory # This returns a list dir_list = os.listdir() for item in dir_list: print(item) 
# Get the Absolute Path name of a file (file + current working dir) os.path.abspath('some-file') 
#Get the basename - returns file os.path.basename('/path/to/file') 
# Split a directory path - platform independent os.path.split(os.getcwd()) # Out[17]: ('/Users', 'jillian') 
# Check if a path exists os.path.exists('/path/on/filesystem') 
# Check if a path is a symlink os.path.islink() 

Move files and directories around

# Copy a directory # cp -rf shutil.copytree('src', 'dest') 
# Copy a file # cp -rf shutil.copyfile('file1', 'file2') 
# Move a directory # mv shutil.move('src', 'dest') 

Not everything is going to be available through python libraries, such as installing system libraries, so run a few system commands!

# Run an arbitrary system command command = "echo 'hello'" result = subprocess.run(command.split(' '), stdout=subprocess.PIPE, stderr=subprocess.PIPE) #Print the stdout and stderr print(result.stdout) print(result.stderr) 

Write to files!

# Write to a file (and create it if it doesn't exist) # echo "hello" > hello.txt f= open("hello.txt","w+") f.write("hello!") f.close() 
# Append to a file # echo "hello" >> hello.txt f = open("hello.txt", "a+") f.write("hello again!") f.close() 

Write some tests!

Tests mostly work by using a function called assert, which is essentially saying make sure this is true and if not die loudly.

def test_system_command(): """Test the exit code of a system command""" command = "echo 'hello'" result = subprocess.run(command.split(' '), stdout=subprocess.PIPE) assert result.returncode == 0 

Put this function in a file called test_my_code.py and run as pytest test_my_code.py.

Wrap Up

That's it for my main tips and tricks for using Python as your go-to bash replacement. The next time you need to write a loop in bash, consider breaking out the iPython console and seeing what you can come up with instead!