Am o relație de dragoste și ură cu Bash. Petrec mult timp în terminal și bash este „limbajul de programare” implicit. Uneori le spun oamenilor care găsesc, grep și xargs își gestionează infrastructura și râd și râd până își dau seama că vorbesc serios.

Preluarea unor Python este o alegere perfectă pentru administratorii de sistem. Este, de asemenea, minunat pentru oricine are de-a face cu ceva dintr-un terminal, dar nu vrea să folosească bash sau are nevoi prea complexe pentru bash. Odată ce o sarcină trece dincolo

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

este timpul să izbucnim Python!

Există multe avantaje în utilizarea Python ca limbaj de linie de comandă.

  • Python are o mulțime de biblioteci frumoase pentru a vă ajuta cu aproape orice. Aceasta include tratarea operațiunilor de sistem, citirea fișierelor, listarea directoarelor, scrierea buclelor, verificarea codurilor de ieșire și așa mai departe.
  • Completați automat cu IDE-uri. Serios. Cine vrea să trebuiască să memoreze ceva?
  • Suită de testare robustă dacă asta e treaba ta (și dacă nu este așa, ar trebui să iei în considerare transformarea în chestiunea ta).
  • Consola iPython. E minunat. Este uimitor. IMI PLACE.
  • Python este disponibil pe majoritatea sistemelor și, dacă nu, îl puteți obține Miniconda.
  • Verificare robustă a erorilor cu blocuri de încercare și captură.
  • Dacă lucrați pe diferite sisteme de operare, puteți utiliza biblioteci Python care se vor ocupa de toate acestea sub capotă.
  • Chiar dacă nu aveți abilități de programare Python este un limbaj ușor de început.

Să începem

Pentru a începe, trebuie să aveți instalat Python sau să-l instalați cu Miniconda.

Verificați dacă aveți instalat iPython

which python
which ipython

Dacă ambele au succes, ești în afaceri! Dacă aveți Python, dar nu iPython, va trebui să îl instalați. L-ați putea instala ca pachet de sistem, dar vă recomand cu adevărat să îl instalați doar cu Miniconda.

Instalați Miniconda

Luați programul de instalare pentru sistemul dvs. de operare aici. Vă sugerez să obțineți instalarea Python3.

Atunci este doar o instalare simplă.

bash Miniconda3-latest-Linux-x86_64.sh

Urmați instrucțiunile și veți avea instalat Miniconda3. După ce îl aveți instalat, veți dori să rulați o actualizare, deoarece aceasta este tehnologie și, bineînțeles, doriți să rulați o actualizare. 😉

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

Depanare

Dacă aveți probleme la instalarea pachetelor, iată câteva sfaturi.

  • Alerga conda clean --all si incearca din nou.
  • Asigurați-vă că utilizați canalul corect.
  • Alerga conda update -y --all
  • Încercați să instalați cât mai puțin posibil în spațiul de condare global. În schimb, creați medii pentru diferite sarcini și proiecte, pe care le vom intra în continuare.

Creați medii cu Conda

Dacă ați folosit vreodată virtualenv, pipenv (este un lucru?), Rbenv, plenv, nimicv sau oricare dintre celelalte invii care au apărut de-a lungul anilor, acest lucru vă va suna foarte familiar. Ideea este că diferite proiecte ar trebui să aibă propriile medii software izolate.

conda create -n my-project ipython package1 package2 package2

Dacă sunteți ca mine și doriți ca iPython să fie ușor disponibil, asigurați-vă că îl instalați în orice mediu nou!

Biblioteci Python pentru administrarea sistemului

Înainte de a intra în exemple, să enumerăm câteva pachete utile împreună cu documentele lor.

Merg la pachet este os pachet. Îl puteți folosi pentru a lista directoare, pentru a verifica dacă există fișiere, pentru a verifica dacă există legături simbolice, pentru a crea directoare, pentru a rula comenzi de sistem, pentru a obține și seta variabile de mediu și multe altele. E minunat!

Al doilea pachet pentru rularea comenzilor de sistem care nu există ca biblioteci Python la îndemână este subproces modul.

shutil are operații de fișiere care nu se află în biblioteca OS.

pprint biblioteca tipărește structuri de date complexe cu o indentare frumoasă.

pytest biblioteca vă permite să testați codul Python, pentru că să recunoaștem, nimic nu funcționează corect în primele (puține) ori.

Cum îmi execut codul?

In cele din urma! Cod!

Captură de ecran-2019-12-13-10.33.52

Când utilizați Python pentru administrarea sistemului, vă puteți scufunda direct în consola iPython sau puteți scrie scripturi și apoi le puteți executa cu python name-of-script.py.

Dacă preferați să vă scrieți scripturile, aveți atât de multe opțiuni și este cu adevărat o chestiune de preferință personală. eu folosesc PyCharm, care este plătit, dar Cod Visual Studio și Atom sunt la fel de excelente alegeri libere.

Constat că depinde la ce lucrez. Uneori deschid consola iPython și încep să scriu și alteori am nevoie de ceva mai robust cu teste și ce nu.

Dacă utilizați fie consola iPython, fie oricare dintre editorii pe care i-am enumerat mai sus, veți avea completarea automată. Completarea automată este minunată! Cu iPython pur și simplu începeți să vă tastați funcția și apăsați fila pentru a obține o listă a funcțiilor potențiale pe care le-ați dori.

Captură de ecran-2019-12-13-10.49.07

Nu pot exprima cât de mult îmi place completarea automată. 😉

Obține ajutor

Puteți accesa oricare dintre paginile doc pentru orice bibliotecă, dar dacă știți numele bibliotecii sau funcția, o puteți afișa în iPython.

Captură de ecran-2019-12-13-10.55.14

Captură de ecran-2019-12-13-10.55.55

Puteți afișa meniul de ajutor și în majoritatea IDE-urilor și editorilor de text, dar acest lucru va fi specific editorului dvs.

Exemple

Mai întâi va trebui să importați pachetele

import os
import subprocess
import shutil
from pprint import pprint

Iată câteva exemple de operații obișnuite de fișiere și directoare.

# 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()

Mutați fișiere și directoare în jur

# 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')

Nu totul va fi disponibil prin intermediul bibliotecilor python, cum ar fi instalarea bibliotecilor de sistem, deci executați câteva comenzi de sistem!

# 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)

Scrieți în fișiere!

# 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()

Scrieți câteva teste!

Testele funcționează în cea mai mare parte folosind o funcție numită asert, care spune în esență să vă asigurați că acest lucru este adevărat și, dacă nu, să moară cu voce tare.

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

Puneți această funcție într-un fișier numit test_my_code.py și aleargă ca. pytest test_my_code.py.

Învelire

Asta este pentru principalele mele sfaturi și trucuri pentru utilizarea Python ca înlocuitor de bash. Data viitoare când trebuie să scrieți o buclă în bash, vă recomandăm să spargeți consola iPython și să vedeți cu ce puteți veni!