Kaip pakeisti „Bash“ kaip „Python“ kaip jūsų komandų eilutės kalbą

Aš turiu šiek tiek meilės ir neapykantos santykių su bash. Daug laiko praleidžiu terminale, o „bash“ yra mano numatytoji „programavimo kalba“. Kartais sakau žmonėms, kad „find, grep“ ir „xargs“ valdo savo infrastruktūrą, o jie juokiasi ir juokiasi, kol supranta, kad aš rimtai.

Pasiimti „Python“ yra puikus pasirinkimas sistemos administratoriams. Tai taip pat puiku tiems, kurie turi ką nors spręsti terminale, bet nenori naudoti „bash“ arba turi per daug kompleksinių poreikių. Kai užduotis peržengia ribas

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

atėjo laikas išlaisvinti „Python“!

Yra daug privalumų naudojant „Python“ kaip komandinės eilutės kalbą.

  • „Python“ turi daug gražių bibliotekų, kurios gali padėti beveik viskuo. Tai apima tvarkymąsi su sistemos operacijomis, failų skaitymą, katalogų sąrašą, rašymą kilpoms, išėjimo kodų tikrinimą ir pan.
  • Automatiškai užbaigti naudojant IDE. Rimtai. Kas nori ką nors įsiminti?
  • Patikimas testavimo rinkinys, jei tai jūsų reikalas (ir jei ne, turėtumėte apsvarstyti galimybę jį paversti savo dalyku).
  • „IPython“ konsolė. Nuostabu. Tai nuostabu. MAN TAI PATINKA.
  • „Python“ yra prieinamas daugelyje sistemų, o jei ne, galite jį gauti naudodami „Miniconda“.
  • Tvirtas klaidų tikrinimas naudojant bandymo ir gaudymo blokus.
  • Jei dirbate su skirtingomis operacinėmis sistemomis, galite naudoti „Python“ bibliotekas, kurios spręs visa tai po gaubtu.
  • Net jei neturite programavimo galimybių, „Python“ yra lengva pradėti naudoti kalbą.

Pradėkime

Norėdami pradėti, pirmiausia turite įdiegti „Python“ arba įdiegti ją kartu su „Miniconda“.

Patikrinkite, ar turite įdiegtą „iPython“

which python which ipython 

Jei abu šie dalykai yra sėkmingi, jūs užsiimate verslu! Jei turite „Python“, bet neturite „iPython“, turėsite jį įdiegti. Galėtumėte jį įdiegti kaip sistemos paketą, bet aš tikrai rekomenduoju jį tiesiog įdiegti su „Miniconda“.

Įdiekite „Miniconda“

Čia patraukite savo OS diegimo programą. Siūlau gauti „Python3“ diegimą.

Tada tai tiesiog paprastas diegimas.

bash Miniconda3-latest-Linux-x86_64.sh 

Vykdykite nurodymus ir turėsite įdiegtą „Miniconda3“. Įdiegę, norėsite paleisti atnaujinimą, nes tai yra technologija ir, žinoma, norite paleisti atnaujinimą. ;-)

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

Problemų sprendimas

Jei kyla problemų diegiant paketus, pateikiame keletą patarimų.

  • Paleiskite conda clean --allir bandykite dar kartą.
  • Įsitikinkite, kad naudojate tinkamą kanalą.
  • Bėk conda update -y --all
  • Pabandykite kuo mažiau įdiegti į savo pasaulinę buto erdvę. Užuot sukūrę aplinką, skirtą įvairioms užduotims ir projektams, į kurias mes pereisime toliau.

Kurkite aplinką naudodami „Conda“

Jei kada nors naudojote virtualenv, pipenv (ar tai dalykas?), Rbenv, plenv, anyenv ar bet kurį iš kitų įvairiausių env, kurie pasirodė per metus, tai jums skambės labai gerai. Idėja yra ta, kad skirtingi projektai turėtų turėti savo izoliuotą programinės įrangos aplinką.

conda create -n my-project ipython package1 package2 package2 

Jei esate panašus į mane ir norite, kad „iPython“ būtų lengvai prieinamas, būtinai įdiekite jį bet kurioje naujoje aplinkoje!

„Python“ bibliotekos sistemos administravimui

Prieš pateikdami pavyzdžius, tiesiog išvardykite keletą patogių paketų kartu su jų dokumentais.

Mano eiti į paketą yra os paketas. Jį galite naudoti katalogų sąrašams tikrinti, ar failai egzistuoja, ar nėra nuorodų, kurti katalogus, vykdyti sistemos komandas, gauti ir nustatyti aplinkos kintamuosius ir dar daugiau. Tai gerai!

Antrasis mano paketas, skirtas paleisti sistemos komandas, kurių nėra kaip patogios „python“ bibliotekos, yra antrinio proceso modulis.

„Shutil“ turi failų operacijas, kurių nėra os bibliotekoje.

Pprint biblioteka išspausdina sudėtingas duomenų struktūras su gražia įtrauka.

„Pytest“ bibliotekoje leiskite išbandyti savo „Python“ kodą, nes pripažinkime, kad niekas niekada neveikia teisingai pirmuosius (kelis) kartus.

Kaip aš galiu vykdyti savo kodą?

Pagaliau! Kodas!

Ekrano kopija-2019-12-13-10.33.52

Kai sistemai administruoti naudojate „Python“, galite nerti tiesiai į „iPython“ konsolę arba rašyti scenarijus ir tada juos vykdyti python name-of-script.py.

Jei norite rašyti scenarijus, turite tiek daug pasirinkimo galimybių, ir tai tikrai priklauso nuo jūsų asmeninių pageidavimų. Aš naudoju „PyCharm“, kuris yra mokamas, tačiau „Visual Studio Code“ ir „Atom“ yra vienodai puikūs nemokami pasirinkimai.

Manau, kad tai priklauso nuo to, ką dirbu. Kartais aš tiesiog atidarau „iPython“ konsolę ir pradedu rašyti, o kartais man reikia kažko patikimesnio su bandymais ir dar ko.

Jei naudojate „iPython“ konsolę arba bet kurį iš anksčiau išvardytų redaktorių, turėsite automatinį užbaigimą. Automatinis užbaigimas yra nuostabus! Su „iPython“ tiesiog pradėkite rašyti savo funkciją ir paspauskite tabuliavimo klavišą, kad gautumėte galimų funkcijų sąrašą.

Ekrano kopija-2019-12-13-10.49.07

Negaliu išreikšti, kaip myliu automatinį užbaigimą. ;-)

Gaukite pagalbos

Galite pereiti į bet kurį bet kurios bibliotekos dokumento puslapį, bet jei žinote bibliotekos pavadinimą ar funkciją, galite ją iškelti „iPython“.

Ekrano kopija-2019-12-13-10.55.14

Ekrano kopija-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!