Πώς να αναλύσετε ορίσματα γραμμής εντολών στην Python

Θέλετε να εκτελέσετε σενάρια Python με ορίσματα γραμμής εντολών; Μάθετε πώς να αναλύετε ορίσματα γραμμής εντολών χρησιμοποιώντας λειτουργικές μονάδες sys, getopt και argparse στην Python.

Στην Python, όταν θέλετε να διαβάσετε την είσοδο χρήστη, θα χρησιμοποιήσετε τη συνάρτηση input(). Ωστόσο, για ορισμένες εφαρμογές, μπορεί να θέλετε να μεταβιβάσετε ορισμένα ορίσματα κατά την εκτέλεση του σεναρίου στη γραμμή εντολών.

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

Ας ξεκινήσουμε!

Κατανόηση του sys.argv στην Python

Εάν έχετε προγραμματίσει σε C, γνωρίζετε ότι ένας από τους απλούστερους τρόπους για να μεταβιβάσετε ορίσματα στο πρόγραμμα είναι μέσω της γραμμής εντολών. Για να το κάνετε αυτό, μπορείτε να δομήσετε την κύρια συνάρτηση ως εξής:

#include<stdio.h>

int main(int argc, char **argv){
    //argc: argument count
    //argv: argument vector
    
    //do something on the args

    return 0;
}

Εδώ, το argc σημαίνει μέτρηση ορίσματος και το argv σημαίνει διάνυσμα ορίσματος.

Εκτέλεση σεναρίων Python με ορίσματα γραμμής εντολών

Στην Python, μπορείτε να εκτελέσετε το σενάριο Python στη γραμμή εντολών χρησιμοποιώντας το python3 filename.py. Όταν το κάνετε αυτό, μπορείτε επίσης να μεταβιβάσετε έναν αυθαίρετο αριθμό ορισμάτων γραμμής εντολών:

$ python3 filename.py arg1 arg2 ... argn

Η λειτουργική μονάδα sys παρέχει υποστήριξη για πρόσβαση και επεξεργασία αυτών των ορισμάτων της γραμμής εντολών. Το sys.argv είναι η λίστα με όλα τα ορίσματα της γραμμής εντολών που μεταβιβάζουμε όταν εκτελούμε το σενάριο Python.

Ακολουθεί ένα παράδειγμα όπου εκτελούμε το main.py με ορίσματα γραμμής εντολών:

$ python3 main.py hello world python script

Μπορούμε να κάνουμε βρόχο μέσω του διανύσματος ορισμάτων χρησιμοποιώντας μια απλή συνάρτηση βρόχου for και απαρίθμησης:

# main.py

import sys

for idx, arg in enumerate(sys.argv):
    print(f"arg{idx}: {arg}")
# Output
arg0:main.py
arg1:hello
arg2:world
arg3:python
arg4:script

Βλέπουμε ότι το πρώτο όρισμα (στο ευρετήριο 0) είναι το όνομα του αρχείου Python. Και τα επόμενα επιχειρήματα ξεκινούν από το δείκτη 1.

Αυτό είναι ένα ελάχιστο πρόγραμμα εργασίας που δέχεται και επεξεργάζεται ορίσματα γραμμής εντολών. Ωστόσο, βλέπουμε ορισμένα προβλήματα:

  • Πώς γνωρίζουν οι χρήστες του προγράμματος ποια επιχειρήματα να περάσουν;
  • Και τι αντιπροσωπεύουν αυτά τα επιχειρήματα;

Αυτό δεν είναι πολύ σαφές. Για να το αντιμετωπίσετε, μπορείτε να χρησιμοποιήσετε είτε τις ενότητες getopt είτε τις αρθρογραφικές μονάδες. Και αυτό θα το μάθουμε στις επόμενες ενότητες.✅

Ανάλυση επιχειρημάτων γραμμής εντολών με χρήση του getopt της Python

Ας μάθουμε πώς να αναλύουμε ορίσματα γραμμής εντολών χρησιμοποιώντας την ενσωματωμένη μονάδα getopt.

Μετά την εισαγωγή του getopt από τη λειτουργική μονάδα getopt, μπορείτε να καθορίσετε τα ορίσματα προς ανάλυση και τις σύντομες και μεγάλες επιλογές για την εκτέλεση του σεναρίου. Πρέπει να αναλύσουμε όλα τα ορίσματα που ξεκινούν από το ευρετήριο 1 στο sys.argv. Έτσι, το κομμάτι για ανάλυση είναι sys.argv[1:].

  Πώς να μετατρέψετε ένα GIF σε βίντεο

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

Αλλά πώς διασφαλίζουμε ότι μια συγκεκριμένη επιλογή απαιτεί επιχείρημα;

  • Στις σύντομες επιλογές, μπορείτε να κάνετε μια επιλογή να απαιτεί όρισμα προσθέτοντας άνω και κάτω τελεία (:) μετά το όνομα σύντομης επιλογής.
  • Ομοίως, στις μεγάλες επιλογές, μπορείτε να προσθέσετε ένα σύμβολο = μετά τη μεγάλη επιλογή. Μπορούμε να συλλάβουμε αυτές τις επιλογές και τα αντίστοιχα επιχειρήματά τους.

Προσθέτοντας αυτά, θα έχουμε τον ακόλουθο κώδικα στο main.py:

# main.py

import sys
from getopt import getopt

opts, args = getopt(sys.argv[1:],'m:f:',['message=","file="])

print(opts)
print(args)

Εδώ, η μεταβλητή opts περιέχει τις επιλογές και τα ορίσματα ως λίστα πλειάδων. Οποιοδήποτε άλλο όρισμα θέσης που θα μεταφέρουμε θα συλλέγεται στη μεταβλητή args.

Μπορούμε να περάσουμε το μήνυμα και το όνομα αρχείου για να τρέξουμε το σενάριο και μπορούμε να χρησιμοποιήσουμε είτε τις σύντομες είτε τις μεγάλες επιλογές.

Εκτελώντας το main.py χρησιμοποιώντας τις μεγάλες επιλογές, έχουμε:

$ python3 main.py --message hello --file somefile.txt

Έχουμε τις επιλογές και τα ορίσματα ως πλειάδες στη μεταβλητή opts. Καθώς δεν έχουμε περάσει σε κανένα όρισμα θέσης, το args είναι μια κενή λίστα.

# Output
[("--message', 'hello'), ('--file', 'somefile.txt')]
[]

Ισοδύναμα, μπορούμε επίσης να χρησιμοποιήσουμε τις σύντομες επιλογές όπως φαίνεται:

$ python3 main.py -m hello -f somefile.txt
# Output
[('-m', 'hello'), ('-f', 'somefile.txt')]
[]

⚠️ Η επιλογή -m short σε αυτό το παράδειγμα δεν πρέπει να συγχέεται με τη σημαία γραμμής εντολών -m που χρησιμοποιείται για την εκτέλεση μιας λειτουργικής μονάδας ως κύριας λειτουργικής μονάδας κατά την εκτέλεση ενός σεναρίου Python.

Για παράδειγμα, θα χρησιμοποιήσετε το python3 -m unittest main.py για να εκτελέσετε το unittest ως κύρια λειτουργική μονάδα κατά την εκτέλεση του main.py.

Αναφέραμε ότι όλα τα άλλα ορίσματα θέσης που μεταβιβάζουμε θα συλλεχθούν στη μεταβλητή args. Εδώ είναι ένα παράδειγμα:

$ python3 main.py -m hello -f somefile.txt another_argument

Η λίστα args περιέχει το όρισμα θέσης Another_argument.

# Output
[('-m', 'hello'), ('-f', 'somefile.txt')]
['another_argument']

Εδώ, το opts είναι μια λίστα με πλειάδες. Μπορούμε λοιπόν να το κάνουμε βρόχο, να αποσυσκευάσουμε την πλειάδα και να βγάλουμε τα ορίσματα που αντιστοιχούν στις συγκεκριμένες επιλογές.

Τι κάνουμε όμως με το όνομα αρχείου και το μήνυμα αφού επεξεργαστούμε αυτά τα ορίσματα; Θα ανοίξουμε το αρχείο στη λειτουργία εγγραφής και θα γράψουμε τη συμβολοσειρά μηνύματος που έχει μετατραπεί σε κεφαλαία στο αρχείο.

# main.py
import sys
from getopt import getopt

opts, args = getopt(sys.argv[1:],'m:f:',['message=","file="])

print(opts)
print(args)

for option, argument in opts:
    if option == "-m':
        message = argument
    if option == '-f':
        file = argument

with open(file,'w') as f:
    f.write(message.upper())

Ας εκτελέσουμε το main.py με τις σύντομες επιλογές και τα ορίσματα της γραμμής εντολών.

$ python main.py -m hello -f thisfile.txt
[('-m', 'hello'), ('-f', 'thisfile.txt')]
[]

Μετά την εκτέλεση του main.py, μπορούμε να δούμε το ‘thisfile.txt’ στον κατάλογο εργασίας μας. Περιέχει τη συμβολοσειρά ‘γεια’ που έχει μετατραπεί σε κεφαλαία (‘HELLO’).

$ ls
main.py  thisfile.txt
$ cat thisfile.txt
HELLO

Πώς να αναλύσετε επιχειρήματα γραμμής εντολών με το Argparse

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

  Πώς να χρησιμοποιήσετε το grtechpc.org API με πελάτες PHP

Για να αναλύσουμε ορίσματα γραμμής εντολών, ας εισαγάγουμε την κλάση ArgumentParser από τη λειτουργική μονάδα argparse. Εδώ, έχουμε δημιουργήσει το arg_parser, ένα αντικείμενο ArgumentParser:

from argparse import ArgumentParser

arg_parser = ArgumentParser()

Στη συνέχεια, θα θέλαμε να προσθέσουμε δύο ορίσματα γραμμής εντολών:

  • μήνυμα: η συμβολοσειρά μηνύματος και
  • αρχείο: το όνομα του αρχείου με το οποίο θα θέλαμε να εργαστούμε.

Τώρα καλούμε τη μέθοδο add_argument() στο arg_parser για να προσθέσουμε και τα δύο αυτά ορίσματα. Στην κλήση της μεθόδου add_argument(), μπορείτε να ορίσετε βοήθεια σε μια συμβολοσειρά (μια περιγραφή του ορίσματος).

arg_parser.add_argument('message',help='message string')
arg_parser.add_argument('file',help='filename')

Μέχρι στιγμής, έχουμε δημιουργήσει το arg_parser και προσθέσαμε τα ορίσματα της γραμμής εντολών. Όταν το πρόγραμμα εκτελείται στη γραμμή εντολών, μπορείτε να χρησιμοποιήσετε τη μέθοδο parse_args() στο arg_parser για να λάβετε τις τιμές των ορισμάτων.

Εδώ, καταγράφουμε τον χώρο ονομάτων του ορίσματος στη μεταβλητή args. Έτσι, μπορείτε να χρησιμοποιήσετε το args.argument_name για να λάβετε τις τιμές των ορισμάτων.

Αφού λάβουμε τις τιμές των ορισμάτων, γράφουμε τη συμβολοσειρά μηνύματος με εναλλαγή πεζών-κεφαλαίων (χρησιμοποιώντας τη μέθοδο συμβολοσειράς swapcase()) στο αρχείο.

args = arg_parser.parse_args()

message = args.message
file = args.file

with open(file,'w') as f:
     f.write(message.swapcase())

Συνδυάζοντας τα όλα μαζί, εδώ είναι το αρχείο main.py:

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('message',help='message string')
arg_parser.add_argument('file',help='filename')

args = arg_parser.parse_args()
print(args)

message = args.message
file = args.file

with open(file,'w') as f:
     f.write(message.swapcase())

Κατανόηση της χρήσης ορίσματος γραμμής εντολών

Για να κατανοήσετε τη χρήση των ορισμάτων κατά την εκτέλεση του main.py, μπορείτε να χρησιμοποιήσετε την επιλογή –help long όπως φαίνεται:

$ python3 main.py --help
usage: main.py [-h] message file

positional arguments:
  message     message string
  file        filename

optional arguments:
  -h, --help  show this help message and exit

Δεν υπάρχουν προαιρετικά ορίσματα και τόσο το μήνυμα όσο και το αρχείο απαιτούνται ορίσματα θέσης. Εναλλακτικά, μπορείτε επίσης να χρησιμοποιήσετε τη σύντομη επιλογή -h:

$ python3 main.py -h
usage: main.py [-h] message file

positional arguments:
  message     message string
  file        filename

optional arguments:
  -h, --help  show this help message and exit

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

Εδώ, έχουμε περάσει σε ένα όρισμα θέσης (Hello) για τη συμβολοσειρά μηνύματος, αλλά δεν έχουμε παράσχει καμία τιμή για το όρισμα αρχείου.

Και λαμβάνουμε ένα σφάλμα που δηλώνει ότι απαιτείται το όρισμα αρχείου.

$ python3 main.py Hello
usage: main.py [-h] message file
main.py: error: the following arguments are required: file

Όταν εκτελούμε το main.py και με τα δύο ορίσματα θέσης, βλέπουμε ότι το args του χώρου ονομάτων περιέχει τις τιμές των ορισμάτων.

$ python3 main.py Hello file1.txt
# Output
Namespace(file="file1.txt", message="Hello")

Τώρα, αν εξετάσουμε τα περιεχόμενα του τρέχοντος καταλόγου εργασίας, βλέπουμε ότι το σενάριο δημιουργεί το αρχείο ‘file1.txt’:

$ ls
file1.txt  main.py

Η αρχική συμβολοσειρά μηνύματος είναι ‘Hello’. Μετά την εναλλαγή της υπόθεσης, η συμβολοσειρά μηνύματος στο αρχείο ‘file1.txt’ είναι ‘HELLO’.

$ cat file1.txt
hELLO

Πώς να κάνετε τα ορίσματα γραμμής εντολών προαιρετικά

Για να κάνετε αυτά τα ορίσματα της γραμμής εντολών προαιρετικά, μπορείτε να προσθέσετε το πρόθεμα του ονόματος ορίσματος με –.

  Πώς να χρησιμοποιήσετε Python Not Equal and Equal Operators

Ας τροποποιήσουμε το main.py για να γίνουν προαιρετικά τόσο το μήνυμα όσο και τα ορίσματα του αρχείου.

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('--message',help='message string')
arg_parser.add_argument('--file',help='filename')

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

if args.message and args.file:
    message = args.message
    file = args.file
else:
    message="Python3"
    file="myfile.txt"

Σε αυτό το σημείο, το αρχείο main.py περιέχει τον ακόλουθο κώδικα:

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('--message',help='message string')
arg_parser.add_argument('--file',help='filename')

args = arg_parser.parse_args()
print(args)

if args.message and args.file:
    message = args.message
    file = args.file
else:
    message="Python3"
    file="myfile.txt"

with open(file,'w') as f:
     f.write(message.swapcase())

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

$ python3 main.py --help
usage: main.py [-h] [--message MESSAGE] [--file FILE]

optional arguments:
  -h, --help         show this help message and exit
  --message MESSAGE  message string
  --file FILE        filename
$ python3 main.py

Στον χώρο ονομάτων ορισμάτων, τόσο το αρχείο όσο και το μήνυμα είναι Κανένα.

# Output
Namespace(file=None, message=None)

Βλέπουμε ότι χρησιμοποιούνται το προεπιλεγμένο όνομα αρχείου και το μήνυμα “myfile.txt” και “Python3”. Το αρχείο ‘myfile.txt’ βρίσκεται τώρα στον κατάλογο εργασίας:

$ ls
file1.txt  main.py  myfile.txt

Και περιέχει τη συμβολοσειρά «Python3» με την κεφαλαία των γραμμάτων να εναλλάσσονται:

$ cat myfile.txt
pYTHON3

Μπορείτε επίσης να χρησιμοποιήσετε τα ορίσματα –message και –file για να κάνετε την εντολή πιο ευανάγνωστη.

$ python3 main.py --message Coding --file file2.txt
# Output
Namespace(file="file2.txt", message="Coding")

Βλέπουμε το ‘file2.txt’ στον κατάλογο εργασίας:

$ ls
file1.txt  file2.txt  main.py  myfile.txt

Και περιέχει τη συμβολοσειρά ‘CODING’ όπως αναμενόταν.

$ cat file2.txt
cODING

συμπέρασμα

Ακολουθεί μια περίληψη των όσων μάθαμε σε αυτό το σεμινάριο:

  • Παρόμοια με τη γλώσσα προγραμματισμού C, στην Python, μπορείτε να έχετε πρόσβαση στα ορίσματα της γραμμής εντολών κάνοντας βρόχο μέσω του ορίσματος vector sys.argv. sys.argv[0] είναι το όνομα του σεναρίου Python. Μας ενδιαφέρει λοιπόν να αναλύσουμε τα ορίσματα sys.argv[1:].
  • Ωστόσο, για να βελτιώσετε την αναγνωσιμότητα και να μπορείτε να προσθέσετε επιλογές, μπορείτε να το χρησιμοποιήσετε για λήψη και ανάλυση αρθρώσεων.
  • Μπορείτε να χρησιμοποιήσετε τη λειτουργική μονάδα getopt για να αναλύσετε τη λίστα ορισμάτων γραμμής εντολών που ξεκινούν από το ευρετήριο 1 έως το τέλος της λίστας. Μπορείτε να καθορίσετε τόσο σύντομες όσο και μεγάλες επιλογές.
  • Όταν μια επιλογή παίρνει ένα όρισμα, μπορείτε να καθορίσετε μια άνω και κάτω τελεία (:) και = μετά τη σύντομη επιλογή και τη μεγάλη επιλογή, αντίστοιχα.
  • Με τη μονάδα argparse της Python, μπορείτε να δημιουργήσετε ένα αντικείμενο ArgumentParser και να χρησιμοποιήσετε τη μέθοδο add_argument() για να προσθέσετε ένα απαιτούμενο όρισμα θέσης. Χρησιμοποιήστε — πριν από το όνομα του ορίσματος για να το κάνετε προαιρετικό.
  • Για να ανακτήσετε τις τιμές των ορισμάτων της γραμμής εντολών, καλέστε τη μέθοδο parse_args() στο αντικείμενο ArgumentParser.

Στη συνέχεια, μάθετε πώς να εκτελείτε ασφαλή κατακερματισμό στην Python.