Πώς να εκτελέσετε σενάρια bash χρησιμοποιώντας Python;

Εάν χρησιμοποιείτε Linux, τότε σίγουρα θα λατρέψετε τις εντολές του κελύφους.

Και αν εργάζεστε με Python, τότε μπορεί να έχετε προσπαθήσει να αυτοματοποιήσετε τα πράγματα. Αυτός είναι ένας τρόπος για να εξοικονομήσετε χρόνο. Μπορεί επίσης να έχετε μερικά σενάρια bash για να αυτοματοποιήσετε τα πράγματα.

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

Τι γίνεται όμως αν έχετε ήδη σενάρια bash που θέλετε να εκτελέσετε χρησιμοποιώντας Python;

Υπάρχει κάποιος τρόπος να εκτελεστούν οι εντολές και τα σενάρια bash στην Python;

Ναι, η Python έχει μια ενσωματωμένη μονάδα που ονομάζεται υποδιεργασία που χρησιμοποιείται για την εκτέλεση των εντολών και των σεναρίων μέσα σε σενάρια Python. Ας δούμε πώς να εκτελούμε εντολές bash και σενάρια σε σενάρια Python λεπτομερώς.

Εκτέλεση εντολών Bash

Όπως ίσως έχετε ήδη δει, η υποδιεργασία της ενότητας χρησιμοποιείται για την εκτέλεση των εντολών και των σεναρίων bash. Παρέχει διαφορετικές μεθόδους και κλάσεις για το ίδιο.

Υπάρχουν κυρίως μία μέθοδος και μία κλάση που πρέπει να γνωρίζετε από την ενότητα υποδιεργασίας. Τρέχουν και Popen. Αυτά τα δύο μας βοηθούν να εκτελέσουμε τις εντολές bash στα σενάρια Python. Ας τα δούμε ένα προς ένα.

subprocess.run()

Η μέθοδος subprocess.run() θα λάβει μια λίστα συμβολοσειρών ως όρισμα θέσης. Αυτό είναι υποχρεωτικό καθώς έχει την εντολή bash και επιχειρήματα για αυτό. Το πρώτο στοιχείο στη λίστα είναι το όνομα της εντολής και τα υπόλοιπα στοιχεία είναι τα ορίσματα της εντολής.

  Πώς να αφαιρέσετε δεδομένα τοποθεσίας κατά την κοινή χρήση φωτογραφιών στο iPhone

Ας δούμε ένα γρήγορο παράδειγμα.

import subprocess
subprocess.run(["ls"])

Το παραπάνω σενάριο παραθέτει όλα τα στοιχεία στον τρέχοντα κατάλογο εργασίας καθώς βρίσκεται το σενάριο. Δεν υπάρχουν ορίσματα για την εντολή στο παραπάνω σενάριο. Έχουμε δώσει μόνο την εντολή bash. Μπορούμε να παρέχουμε επιπλέον ορίσματα στην εντολή ls όπως -l, -a, -la, κ.λπ.

Ας δούμε ένα γρήγορο παράδειγμα με ορίσματα εντολών.

import subprocess
subprocess.run(["ls", "-la"])

Η παραπάνω εντολή εμφανίζει όλα τα αρχεία συμπεριλαμβανομένων των κρυφών αρχείων μαζί με τα δικαιώματα. Παρέχουμε το όρισμα la που εμφανίζει αρχεία και καταλόγους επιπλέον πληροφορίες και κρυφά αρχεία.

Μπορεί να καταλήξουμε να κάνουμε κάποια λάθη κατά τη σύνταξη των εντολών. Τα σφάλματα θα αυξηθούν ανάλογα με τα λάθη. Τι γίνεται αν θέλετε να τα καταγράψετε και να τα χρησιμοποιήσετε αργότερα; Ναι, μπορούμε να το κάνουμε αυτό χρησιμοποιώντας το όρισμα λέξης-κλειδιού stderr.

Ας δούμε ένα παράδειγμα.

import subprocess
result = subprocess.run(["cat", "sample.txt"], stderr=subprocess.PIPE, text=True)
print(result.stderr)

Βεβαιωθείτε ότι δεν έχετε το αρχείο με το όνομα sample.txt στον κατάλογο εργασίας. Η τιμή στο όρισμα λέξης-κλειδιού stderr είναι PIPE που βοηθά στην επιστροφή του σφάλματος σε ένα αντικείμενο. Μπορούμε να έχουμε πρόσβαση αργότερα με το ίδιο όνομα. Και το κείμενο του ορίσματος λέξης-κλειδιού βοηθά να πούμε ότι η έξοδος πρέπει να είναι μια συμβολοσειρά.

Ομοίως, μπορούμε να καταγράψουμε την έξοδο της εντολής χρησιμοποιώντας το όρισμα λέξης κλειδιού stdout.

import subprocess
result = subprocess.run(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print(result.stdout)

subprocess.run() – είσοδος

Μπορείτε να εισάγετε τις εντολές χρησιμοποιώντας το όρισμα λέξης κλειδιού εισαγωγής. Θα δώσουμε εισόδους σε μορφή συμβολοσειράς. Επομένως, πρέπει να ορίσουμε το κείμενο του ορίσματος λέξης-κλειδιού σε True. Από προεπιλογή, το παίρνει σε byte.

Ας δούμε ένα παράδειγμα.

import subprocess
subprocess.run(["python3", "add.py"], text=True, input="2 3")

Στο παραπάνω πρόγραμμα, το σενάριο Python add.py θα λάβει δύο αριθμούς ως είσοδο. Δώσαμε την είσοδο στο σενάριο Python χρησιμοποιώντας το όρισμα λέξης κλειδιού εισαγωγής.

  Ποντάρισμα κρυπτογράφησης: Κάτω από 5 λεπτά [2022]

subprocess.Popen()

Η κλάση subprocess.Popen() είναι προηγμένη από τη μέθοδο subprocess.run(). Μας δίνει περισσότερες επιλογές για να εκτελέσουμε τις εντολές. Θα δημιουργήσουμε ένα στιγμιότυπο της υποδιαδικασίας.Popen() και θα το χρησιμοποιήσουμε για διάφορα πράγματα όπως η γνώση της κατάστασης της εκτέλεσης της εντολής, η λήψη εξόδου, η παροχή εισόδου κ.λπ..,

Υπάρχουν πολλές μέθοδοι της υποδιαδικασίας κλάσης.Popen() που πρέπει να γνωρίζουμε. Ας τα δούμε ένα προς ένα μαζί με τα παραδείγματα κώδικα.

Περίμενε

Χρησιμοποιείται για την αναμονή μέχρι την ολοκλήρωση της εκτέλεσης της εντολής. Οι επόμενες γραμμές του σεναρίου Python δεν θα εκτελεστούν μέχρι την ολοκλήρωση της προηγούμενης εντολής που είναι γραμμένη μετά τη μέθοδο αναμονής. Ας δούμε το παράδειγμα.

import subprocess
process = subprocess.Popen(["ls", "-la"])
print("Completed!")

Εκτελέστε τον παραπάνω κώδικα και παρατηρήστε την έξοδο. Θα δείτε ότι το μήνυμα Ολοκληρώθηκε! εκτυπώνεται πριν από την εκτέλεση της εντολής. Μπορούμε να το αποφύγουμε χρησιμοποιώντας τη μέθοδο αναμονής. Ας περιμένουμε μέχρι την ολοκλήρωση της εντολής.

import subprocess
process = subprocess.Popen(["ls", "-la"])
process.wait()

print("Completed!")

Εάν δείτε την έξοδο για τον παραπάνω κώδικα, τότε θα συνειδητοποιήσετε ότι η αναμονή λειτουργεί πραγματικά. Η δήλωση εκτύπωσης εκτελείται μετά την ολοκλήρωση της εκτέλεσης της εντολής.

ΕΠΙΚΟΙΝΩΝΩ

Η μέθοδος επικοινωνία χρησιμοποιείται για τη λήψη της εξόδου, του σφάλματος και για την εισαγωγή στην εντολή. Επιστρέφει μια πλειάδα που περιέχει έξοδο και σφάλμα αντίστοιχα. Ας δούμε ένα παράδειγμα.

import subprocess
process = subprocess.Popen(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
result = process.communicate()
print(result)

υποδιεργασία.Popen() – είσοδος

Δεν μπορούμε να περάσουμε απευθείας την είσοδο στην τάξη Popen. Πρέπει να χρησιμοποιήσουμε το όρισμα λέξης-κλειδιού που ονομάζεται stdin για να δώσουμε την είσοδο στην εντολή. Η παρουσία της κλάσης Popen θα μας δώσει αντικείμενο stdin. Έχει μια μέθοδο που ονομάζεται εγγραφή η οποία χρησιμοποιείται για να δώσει την είσοδο στην εντολή.

  7 τρόποι για να το διορθώσετε

Όπως συζητήσαμε νωρίτερα, θα λαμβάνει εισόδους ως αντικείμενα που μοιάζουν με byte από προεπιλογή. Επομένως, μην ξεχάσετε να ορίσετε το κείμενο του ορίσματος λέξης-κλειδιού σε True κατά τη δημιουργία της παρουσίας του Popen.

Ας δούμε ένα παράδειγμα.

import subprocess
process = subprocess.Popen(["python3", "add.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
process.stdin.write("2 3")
process.stdin.close()
print(process.stdout.read())

ψηφοφορία

Η μέθοδος poll χρησιμοποιείται για να ελεγχθεί εάν η εκτέλεση της εντολής έχει ολοκληρωθεί ή όχι. Αυτή η μέθοδος θα επιστρέψει None εάν η εντολή εξακολουθεί να εκτελείται. Ας δούμε ένα παράδειγμα.

import subprocess
process = subprocess.Popen(['ping', '-c 5', 'geekflare.com'], stdout=subprocess.PIPE, text=True)
while True:
    output = process.stdout.readline()
    if output:
    	print(output.strip())
    result = process.poll()
    if result is not None:
        break

Στον παραπάνω κώδικα χρησιμοποιήσαμε την εντολή ping με 5 αιτήματα. Υπάρχει ένας άπειρος βρόχος που επαναλαμβάνεται μέχρι την ολοκλήρωση της εκτέλεσης της εντολής. Χρησιμοποιήσαμε τη μέθοδο poll για να ελέγξουμε την κατάσταση της εκτέλεσης της εντολής. Εάν η δημοσκόπηση της μεθόδου επιστρέψει κώδικα διαφορετικό από τον Κανένα, τότε η εκτέλεση ολοκληρώνεται. Και η άπειρη θηλιά σπάει.

Εκτέλεση σεναρίων Bash

Έχουμε δει δύο τρόπους εκτέλεσης των εντολών. Τώρα, ας δούμε πώς να εκτελούμε τα σενάρια bash στα σενάρια Python.

Η υποδιεργασία έχει μια μέθοδο που ονομάζεται κλήση. Αυτή η μέθοδος χρησιμοποιείται για την εκτέλεση των σεναρίων bash. Η μέθοδος επιστρέφει τον κωδικό εξόδου από το σενάριο bash. Ο προεπιλεγμένος κωδικός εξόδου για τα σενάρια bash είναι 0. Ας δούμε ένα παράδειγμα.

Δημιουργήστε ένα σενάριο bash με το όνομα praktik.sh ως εξής.

#!/bin/bash

echo "Hello, World!"
exit 1

Τώρα, γράψτε ένα σενάριο Python για να εκτελέσετε το παραπάνω σενάριο bash.

import subprocess
exit_code = subprocess.call('./practice.sh')
print(exit_code)

Θα λάβετε την ακόλουθη έξοδο μόλις εκτελέσετε το παραπάνω σενάριο Python.

Hello, World!
1

συμπέρασμα

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

Καλή κωδικοποίηση 👨‍💻