Sådan udskiftes Bash med Python som dit Go-To Command Line Language

Jeg har lidt af et kærligheds- og hadforhold med bash. Jeg bruger meget tid i terminalen, og bash er mit standard "programmeringssprog". Nogle gange fortæller jeg folk, der finder, grep og xargs driver deres infrastruktur, og de griner og griner, indtil de er klar over, at jeg er seriøs.

At hente noget Python er et perfekt valg for systemadministratorer. Det er også godt for alle, der har at gøre med noget i en terminal, men ikke ønsker at bruge bash eller har behov, der er for komplekse til bash. Når en opgave går ud over

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

det er tid til at bryde Python ud!

Der er mange fordele ved at bruge Python som din go to command line sprog.

  • Python har mange gode biblioteker til at hjælpe med stort set alt. Dette inkluderer håndtering af systemoperationer, læsning af filer, notering af mapper, skrivning til sløjfer, kontrol af udgangskoder osv.
  • Autofuldfør med IDE'er. Helt seriøst. Hvem ønsker at skulle huske noget?
  • Robust testpakke, hvis det er dine ting (og hvis det ikke er det, bør du overveje at gøre det til dine ting).
  • IPython-konsollen. Det er vidunderligt. Det er fantastisk. JEG ELSKER DET.
  • Python er tilgængelig på de fleste systemer, og hvis det ikke er, kan du få det med Miniconda.
  • Robust fejlkontrol med forsøg og fangstblokke.
  • Hvis du arbejder på forskellige operativsystemer, kan du bruge Python-biblioteker, der beskæftiger sig med alt det under emhætten.
  • Selvom du ikke har nogen programmeringsevne, er Python et let sprog at komme i gang med.

Lad os komme igang

For at komme i gang skal du først og fremmest enten have Python installeret eller installere det med Miniconda.

Kontroller, om du har installeret iPython

which python which ipython 

Hvis begge disse er vellykkede, har du forretning! Hvis du har Python, men ikke iPython, skal du installere det. Du kan installere det som en systempakke, men jeg anbefaler virkelig, at du bare installerer det med Miniconda.

Installer Miniconda

Tag installationsprogrammet til dit operativsystem her. Jeg foreslår at få Python3-installationen.

Så er det bare en simpel installation.

bash Miniconda3-latest-Linux-x86_64.sh 

Følg vejledningen, så får du Miniconda3 installeret. Når du har installeret det, vil du køre en opdatering, fordi dette er teknisk, og selvfølgelig vil du køre en opdatering. ;-)

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

Fejlfinding

Hvis du har problemer med at installere pakker, er der nogle tip.

  • Kør conda clean --allog prøv igen.
  • Sørg for, at du bruger den rigtige kanal.
  • Løb conda update -y --all
  • Prøv at installere så lidt som muligt på dit globale conda-rum. Opret i stedet miljøer til forskellige opgaver og projekter, som vi kommer ind i næste gang.

Opret miljøer med Conda

Hvis du nogensinde har brugt virtualenv, pipenv (er det en ting?), Rbenv, plenv, anyenv eller nogen af ​​de andre forskellige envs, der er dukket op gennem årene, lyder dette meget kendt for dig. Ideen er, at forskellige projekter skal have deres egne isolerede softwaremiljøer.

conda create -n my-project ipython package1 package2 package2 

Hvis du er ligesom mig og gerne vil have iPython let tilgængelig, skal du sørge for at installere det i nye miljøer!

Python-biblioteker til systemadministration

Før vi går ind i eksemplerne, lad os bare liste nogle praktiske pakker sammen med deres dokumenter.

Min gå til pakke er OS-pakken. Du kan bruge den til at liste mapper, kontrollere om der findes filer, kontrollere om der findes symlinks, oprette mapper, køre systemkommandoer, hente og indstille miljøvariabler og mere. Det er godt!

Min anden pakke til kørsel af systemkommandoer, der ikke findes som praktiske pythonbiblioteker, er underprocessormodulet.

Shutil har filhandlinger, der ikke er i os-biblioteket.

Pprint-biblioteket udskriver komplekse datastrukturer med flot indrykning.

Med pytest-biblioteket kan du teste din Python-kode, for lad os indse det, intet fungerer nogensinde korrekt de første (få) gange.

Hvordan udfører jeg min kode?

Endelig! Kode!

Skærmbillede-2019-12-13-10.33.52

Når du bruger Python til systemadministration, kan du dykke direkte ind i iPython-konsollen eller skrive scripts og derefter udføre dem med python name-of-script.py.

Hvis du foretrækker at skrive dine scripts, har du så mange valg, og det er virkelig et spørgsmål om personlig præference. Jeg bruger PyCharm, som betales, men Visual Studio Code og Atom er lige så gode gratis valg.

Jeg finder ud af, at det afhænger af, hvad jeg arbejder på. Nogle gange åbner jeg bare iPython-konsollen og begynder at skrive, og andre gange har jeg brug for noget mere robust med tests og andet.

Hvis du bruger enten iPython-konsollen eller en af ​​de redaktører, jeg har nævnt ovenfor, har du autofuldførelse. Autofuldførelse er fantastisk! Med iPython skal du blot begynde at skrive din funktion og trykke på fanen for at få en liste over potentielle funktioner, du måske vil have.

Skærmbillede-2019-12-13-10.49.07

Jeg kan ikke udtrykke, hvor meget jeg elsker autofuldførelse. ;-)

Få hjælp

Du kan gå til en hvilken som helst doc-side for ethvert bibliotek, men hvis du kender navnet på enten biblioteket eller funktionen, kan du bringe det op i iPython.

Skærmbillede-2019-12-13-10.55.14

Skærmbillede-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!