Πώς να εκτελέσετε εντολές Shell σε Python χρησιμοποιώντας τη μέθοδο εκτέλεσης υποεπεξεργασίας

How Execute Shell Commands Python Using Subprocess Run Method



Το Subprocess είναι μια ενσωματωμένη μονάδα Python που μπορεί να χρησιμοποιηθεί για τη δημιουργία νέων διεργασιών και την αλληλεπίδραση με τις ροές δεδομένων εισόδου και εξόδου. Με απλούστερους όρους, μπορείτε να το χρησιμοποιήσετε για την εκτέλεση εντολών κελύφους και την εκτέλεση εκτελέσιμων δυαδικών αρχείων που συνήθως είναι διάσπαρτα σε διάφορους φακέλους κάδων σε ένα σύστημα αρχείων Linux. Μπορείτε επίσης να παρέχετε μια πλήρη διαδρομή σε ένα εκτελέσιμο δυαδικό αρχείο και να χρησιμοποιείτε τυχόν διακόπτες γραμμής εντολών που σχετίζονται με το δυαδικό. Αυτό το άρθρο θα εξηγήσει πώς να χρησιμοποιήσετε τη μονάδα υποεπεξεργασίας και τη μέθοδο εκτέλεσης της σε εφαρμογές Python. Όλα τα δείγματα κώδικα στο άρθρο δοκιμάζονται με Python 3.8.2 στο Ubuntu 20.04.

Η μέθοδος Subprocess.run

Η μέθοδος Subprocess.run λαμβάνει μια λίστα με ορίσματα. Όταν καλείται η μέθοδος, εκτελεί την εντολή και περιμένει να ολοκληρωθεί η διαδικασία, επιστρέφοντας στο τέλος ένα αντικείμενο CompletedProcess. Το αντικείμενο CompletedProcess επιστρέφει stdout, stderr, αρχικά ορίσματα που χρησιμοποιήθηκαν κατά την κλήση της μεθόδου και έναν κωδικό επιστροφής. Το Stdout αναφέρεται στη ροή δεδομένων που παράγεται από την εντολή, ενώ το stderr αναφέρεται σε τυχόν σφάλματα που προκύπτουν κατά την εκτέλεση του προγράμματος. Οποιοσδήποτε μηδενικός κωδικός επιστροφής (κωδικός εξόδου) θα σήμαινε σφάλμα με την εντολή που εκτελέστηκε στη μέθοδο subprocess.run.







Παράδειγμα 1: Περιεχόμενα εξόδου ενός αρχείου κειμένου χρησιμοποιώντας τη μέθοδο Subprocess.run

Η παρακάτω εντολή θα εξάγει τα περιεχόμενα ενός αρχείου data.txt, υποθέτοντας ότι περιέχει ένα όνομα = συμβολοσειρά John.



εισαγωγή υποεπεξεργασία
υποεπεξεργασίαΤοτρέξιμο(['Γάτα', 'data.txt'])

Η εκτέλεση του παραπάνω κώδικα θα επιστρέψει την ακόλουθη έξοδο:



όνομα=Γιάννης
Ολοκληρωμένη διαδικασία(αψίδες=['Γάτα', 'data.txt'],κωδικός επιστροφής=0)

Το πρώτο στοιχείο του ορίσματος της λίστας είναι το όνομα της εντολής που πρέπει να εκτελεστεί. Οποιοδήποτε στοιχείο στη λίστα που ακολουθεί το πρώτο στοιχείο θεωρούνται επιλογές γραμμής εντολών ή διακόπτες. Μπορείτε επίσης να χρησιμοποιήσετε μονές παύλες και διπλές παύλες, για να ορίσετε τις επιλογές. Για παράδειγμα, για να παραθέσετε αρχεία και φακέλους σε έναν κατάλογο, ο κώδικας θα είναι subprocess.run ([ls, -l]. Στις περισσότερες από αυτές τις περιπτώσεις, μπορείτε να θεωρήσετε οποιοδήποτε όρισμα διαχωρισμένου χώρου σε μια εντολή κελύφους ως μεμονωμένο στοιχείο στο η λίστα που παρέχεται στη μέθοδο subprocess.run.





Παράδειγμα 2: Καταστολή εξόδου της μεθόδου Subprocess.run

Για να αποκρύψετε την έξοδο της μεθόδου subprocess.run, θα πρέπει να παρέχετε stdout = subprocess.DEVNULL και stderr = subprocess.DEVNULL ως πρόσθετα ορίσματα.

εισαγωγή υποεπεξεργασία

υποεπεξεργασίαΤοτρέξιμο(['Γάτα', 'data.txt'],stdout=υποεπεξεργασίαΤοDEVNULL,
stderr=υποεπεξεργασίαΤοDEVNULL)

Η εκτέλεση του παραπάνω κώδικα θα παράγει την ακόλουθη έξοδο:



Ολοκληρωμένη διαδικασία (args = ['cat', 'data.txt'], returncode = 0)

Παράδειγμα 3: Καταγραφή εξόδου της μεθόδου Subprocess.run

Για να καταγράψετε την έξοδο της μεθόδου subprocess.run, χρησιμοποιήστε ένα επιπλέον όρισμα με το όνομα capture_output = True.

εισαγωγή υποεπεξεργασία
παραγωγή= υποεπεξεργασίαΤοτρέξιμο(['Γάτα', 'data.txt'],capture_output=Αληθής)
Τυπώνω (παραγωγή)

Η εκτέλεση του παραπάνω κώδικα θα παράγει την ακόλουθη έξοδο:

Ολοκληρωμένη διαδικασία(αψίδες=['Γάτα', 'data.txt'],κωδικός επιστροφής=0,
stdout=σι'όνομα = Γιάννης n',stderr=σι'')

Μπορείτε να έχετε πρόσβαση μεμονωμένα στις τιμές stdout και stderr χρησιμοποιώντας τις μεθόδους output.stdout και output.stderr. Η έξοδος παράγεται ως ακολουθία byte. Για να λάβετε μια συμβολοσειρά ως έξοδο, χρησιμοποιήστε τη μέθοδο output.stdout.decode (utf-8). Μπορείτε επίσης να δώσετε κείμενο = True ως επιπλέον όρισμα στην κλήση subprocess.run για να λάβετε την έξοδο σε μορφή συμβολοσειράς. Για να λάβετε τον κωδικό κατάστασης εξόδου, μπορείτε να χρησιμοποιήσετε τη μέθοδο output.returncode.

Παράδειγμα 4: Αύξηση εξαίρεσης για αποτυχία εκτέλεσης εντολών με τη μέθοδο Subprocess.run

Για να αυξήσετε μια εξαίρεση όταν η εντολή εξέρχεται με μη μηδενική κατάσταση, χρησιμοποιήστε το όρισμα check = True.

εισαγωγή υποεπεξεργασία
υποεπεξεργασίαΤοτρέξιμο(['Γάτα', 'data.tx'],capture_output=Αληθής,κείμενο=Αληθής,έλεγχος=Αληθής)

Η εκτέλεση του παραπάνω κώδικα θα παράγει την ακόλουθη έξοδο:

αύξηση CalledProcessError (επανακώδικας, process.args,
subprocess.CalledProcessError: Εντολή '[' cat ',' data.tx ']'
επέστρεψε κατάσταση μηδενικής εξόδου 1.

Παράδειγμα 5: Περάστε μια συμβολοσειρά στην εντολή που εκτελείται με τη μέθοδο Subprocess.run

Μπορείτε να περάσετε μια συμβολοσειρά στην εντολή που πρέπει να εκτελεστεί με τη μέθοδο subprocess.run χρησιμοποιώντας το όρισμα input = ’string’.

εισαγωγή υποεπεξεργασία
παραγωγή= υποεπεξεργασίαΤοτρέξιμο(['Γάτα'], εισαγωγή='data.txt',capture_output=Αληθής,
κείμενο=Αληθής,έλεγχος=Αληθής)
Τυπώνω (παραγωγή)

Η εκτέλεση του παραπάνω κώδικα θα παράγει την ακόλουθη έξοδο:

Ολοκληρωμένη διαδικασία (args = ['cat'], returncode = 0, stdout = 'data.txt', stderr = '')

Όπως μπορείτε να δείτε, ο παραπάνω κώδικας μεταδίδει το data.txt ως συμβολοσειρά και όχι ως αντικείμενο αρχείου. Για να περάσετε το data.txt ως αρχείο, χρησιμοποιήστε το όρισμα stdin.

με Άνοιξε('data.txt') όπως καιφά:
παραγωγή= υποεπεξεργασίαΤοτρέξιμο(['Γάτα'],stdin=φά,capture_output=Αληθής,
κείμενο=Αληθής,έλεγχος=Αληθής)
Τυπώνω (παραγωγή)

Η εκτέλεση του παραπάνω κώδικα θα παράγει την ακόλουθη έξοδο:

Ολοκληρωμένη διαδικασία (args = ['cat'], returncode = 0, stdout = 'name = John n', stderr = '')

Παράδειγμα 6: Εκτέλεση εντολής απευθείας στο Shell χρησιμοποιώντας τη μέθοδο Subprocess.run

Είναι δυνατή η εκτέλεση μιας εντολής απευθείας σε ένα κέλυφος ως έχει, αντί να χρησιμοποιήσετε μια διαίρεση συμβολοσειράς στην κύρια εντολή και τις επιλογές που την ακολουθούν. Για να γίνει αυτό, πρέπει να περάσετε το shell = True ως πρόσθετο όρισμα. Ωστόσο, αυτό αποθαρρύνεται από τους προγραμματιστές python καθώς η χρήση του shell = True μπορεί να οδηγήσει σε ζητήματα ασφαλείας. Μπορείτε να διαβάσετε περισσότερα για τις επιπτώσεις στην ασφάλεια από εδώ Το

εισαγωγή υποεπεξεργασία
υποεπεξεργασίαΤοτρέξιμο('cat' data.txt '',κέλυφος=Αληθής)

Η εκτέλεση του παραπάνω κώδικα θα παράγει την ακόλουθη έξοδο:

όνομα = Γιάννης

συμπέρασμα

Η μέθοδος subprocess.run στην Python είναι αρκετά ισχυρή, καθώς σας επιτρέπει να εκτελείτε εντολές κελύφους μέσα στην ίδια την python. Αυτό βοηθά στον περιορισμό όλου του κώδικα στην ίδια την python χωρίς να χρειάζεται επιπλέον κώδικα σεναρίου κελύφους σε ξεχωριστά αρχεία. Ωστόσο, μπορεί να είναι αρκετά δύσκολο να συμβολίσετε σωστά τις εντολές κελύφους σε μια λίστα python. Μπορείτε να χρησιμοποιήσετε τη μέθοδο shlex.split () για να συμβολίσετε απλές εντολές κελύφους, αλλά σε μεγάλες, πολύπλοκες εντολές - ειδικά αυτές με σύμβολα σωλήνων - το shlex αποτυγχάνει να χωρίσει σωστά την εντολή. Σε τέτοιες περιπτώσεις, ο εντοπισμός σφαλμάτων μπορεί να είναι ένα δύσκολο θέμα. Μπορείτε να χρησιμοποιήσετε το κέλυφος = True επιχείρημα για να το αποφύγετε, αλλά υπάρχουν ορισμένες ανησυχίες για την ασφάλεια που σχετίζονται με αυτήν την ενέργεια.