Как да замените 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 или някой от другите различни envs, които се появяват през годините, това ще ви звучи много познато. Идеята е различните проекти да имат собствена изолирана софтуерна среда.

conda create -n my-project ipython package1 package2 package2 

Ако сте като мен и искате да имате iPython лесно на разположение, уверете се, че го инсталирате във всяка нова среда!

Python библиотеки за системно администриране

Преди да влезем в примерите, нека просто изброим някои полезни пакети заедно с техните документи.

Моят пакет към os е 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!