Πώς να αντικαταστήσετε το Bash με το Python ως γλώσσα γραμμής εντολών Go-To

Έχω μια σχέση αγάπης και μίσους με τον bash. Περνάω πολύ χρόνο στο τερματικό και το bash είναι η προεπιλεγμένη "γλώσσα προγραμματισμού". Μερικές φορές λέω σε ανθρώπους που βρίσκουν, το grep και το xargs εκτελούν την υποδομή τους, και γελούν και γελούν μέχρι να συνειδητοποιήσουν ότι είμαι σοβαρός.

Η παραλαβή κάποιου Python είναι η τέλεια επιλογή για διαχειριστές συστήματος. Είναι επίσης εξαιρετικό για όποιον έχει να κάνει με οτιδήποτε στο τερματικό αλλά δεν θέλει να χρησιμοποιήσει bash ή έχει ανάγκες που είναι πολύ περίπλοκες για bash. Μόλις μια εργασία ξεπεράσει

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

ήρθε η ώρα να ξεσπάσει ο Python!

Υπάρχουν πολλά οφέλη από τη χρήση του Python ως γλώσσα γραμμής εντολών.

  • Η Python έχει πολλές ωραίες βιβλιοθήκες για να βοηθήσει με σχεδόν οτιδήποτε. Αυτό περιλαμβάνει την αντιμετώπιση των λειτουργιών του συστήματος, την ανάγνωση αρχείων, την καταγραφή καταλόγων, τη σύνταξη βρόχων, τον έλεγχο για κωδικούς εξόδου και ούτω καθεξής.
  • Αυτόματη συμπλήρωση με IDE. Σοβαρά. Ποιος θέλει να απομνημονεύσει κάτι;
  • Ισχυρή δοκιμαστική σουίτα αν αυτό είναι δικό σου (και αν δεν είναι, θα πρέπει να το κάνεις δικό σου).
  • Η κονσόλα iPython. Είναι υπέροχο. Είναι καταπληκτικό. ΤΟ ΑΓΑΠΩ.
  • Το Python είναι διαθέσιμο στα περισσότερα συστήματα, και αν δεν μπορείτε να το αποκτήσετε με τη Miniconda.
  • Ισχυρός έλεγχος σφαλμάτων με μπλοκ δοκιμής και σύλληψης
  • Εάν εργάζεστε σε διαφορετικά λειτουργικά συστήματα μπορείτε να χρησιμοποιήσετε βιβλιοθήκες 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 ή οποιοδήποτε από τα άλλα διάφορα envs που έχουν εμφανιστεί όλα αυτά τα χρόνια, αυτό θα σας φανεί πολύ οικείο. Η ιδέα είναι ότι διαφορετικά έργα πρέπει να έχουν το δικό τους απομονωμένο περιβάλλον λογισμικού.

conda create -n my-project ipython package1 package2 package2 

Εάν είστε σαν εμένα και θέλετε να έχετε το iPython άμεσα διαθέσιμο, βεβαιωθείτε ότι το έχετε εγκαταστήσει σε οποιοδήποτε νέο περιβάλλον!

Βιβλιοθήκες Python για διαχείριση συστήματος

Προτού αναφερθούμε στα παραδείγματα, ας παραθέσουμε μερικά χρήσιμα πακέτα μαζί με τα έγγραφά τους.

Το πακέτο μου είναι το πακέτο OS. Μπορείτε να το χρησιμοποιήσετε για να απαριθμήσετε καταλόγους, να ελέγξετε αν υπάρχουν αρχεία, να ελέγξετε αν υπάρχουν symlinks, να κάνετε καταλόγους, να εκτελείτε εντολές συστήματος, να λαμβάνετε και να ορίζετε περιβαλλοντικές μεταβλητές και πολλά άλλα. Ειναι υπεροχο!

Το δεύτερο πακέτο μου για εκτέλεση εντολών συστήματος που δεν υπάρχουν ως εύχρηστες βιβλιοθήκες python είναι η λειτουργική μονάδα υποεπεξεργασίας.

Το κλείσιμο έχει λειτουργίες αρχείων που δεν βρίσκονται στη βιβλιοθήκη OS.

Η βιβλιοθήκη εκτύπωσης εκτυπώνει σύνθετες δομές δεδομένων με ωραία εσοχή.

Η βιβλιοθήκη 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!