Как заменить Bash на Python в качестве языка командной строки

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

Создавайте среды с Conda

Если вы когда-либо использовали virtualenv, pipenv (это что-то?), Rbenv, plenv, anyenv или любые другие различные env, которые появлялись за эти годы, это будет вам очень знакомо. Идея состоит в том, что разные проекты должны иметь свои изолированные программные среды.

conda create -n my-project ipython package1 package2 package2 

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

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

Прежде чем мы перейдем к примерам, давайте просто перечислим несколько удобных пакетов вместе с их документацией.

Мой пакет перехода - это пакет ОС. Вы можете использовать его для вывода списка каталогов, проверки наличия файлов, проверки наличия символических ссылок, создания каталогов, выполнения системных команд, получения и установки переменных среды и т. Д. Здорово!

Мой второй пакет для запуска системных команд, которые не существуют в виде удобных библиотек Python, - это модуль подпроцесса.

В shutil есть файловые операции, которых нет в библиотеке ОС.

Библиотека pprint распечатывает сложные структуры данных с красивыми отступами.

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

Как мне выполнить свой код?

В заключение! Код!

Screenshot-2019-12-13-10.33.52

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

If you prefer to write your scripts you have so many choices, and it's truly a matter of personal preference. I use PyCharm, which is paid, but Visual Studio Code and Atom are equally excellent free choices.

I find that it depends on what I'm working on. Sometimes I just open up the iPython console and start typing, and other times I need something more robust with tests and whatnot.

If you're using either the iPython console or any of the editors I listed above, you will have autocomplete. Autocomplete is awesome! With iPython simply start typing your function and press tab to get a list of potential functions you may want.

Screenshot-2019-12-13-10.49.07

I cannot express how much I love autocomplete. ;-)

Get Help

You can go to any of the doc pages for any library, but if you know the name of either the library or the function you can bring it up in iPython.

Screenshot-2019-12-13-10.55.14

Screenshot-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!