Phân tích cú pháp Python sys argv

Chuyển đến nội dung chính

Giới thiệu về Python

Nắm vững kiến ​​thức cơ bản về phân tích dữ liệu với Python chỉ trong bốn giờ. Khóa học trực tuyến này sẽ giới thiệu giao diện Python và khám phá các gói phổ biến

Python trung cấp

Nâng cao kỹ năng khoa học dữ liệu của bạn bằng cách tạo trực quan hóa bằng Matplotlib và thao tác với DataFrames bằng gấu trúc

Mô-đun sys của Python cung cấp quyền truy cập vào bất kỳ đối số dòng lệnh nào thông qua sys. argv. Điều này phục vụ hai mục đích -

  • hệ thống. argv là danh sách các đối số dòng lệnh

  • len(sys. argv) là số đối số dòng lệnh

đây sys. argv[0] là chương trình tức là. tên kịch bản

Thí dụ

Hãy xem xét thử nghiệm tập lệnh sau. py -

#!/usr/bin/python

import sys

print 'Number of arguments:', len(sys.argv), 'arguments.'
print 'Argument List:', str(sys.argv)

Bây giờ hãy chạy tập lệnh trên như sau -

$ python test.py arg1 arg2 arg3

Điều này tạo ra kết quả sau -

Number of arguments: 4 arguments.
Argument List: ['test.py', 'arg1', 'arg2', 'arg3']

LƯU Ý - Như đã đề cập ở trên, đối số đầu tiên luôn là tên tập lệnh và nó cũng được tính vào số lượng đối số

Phân tích đối số dòng lệnh

Python đã cung cấp một mô-đun getopt giúp bạn phân tích các đối số và tùy chọn dòng lệnh. Mô-đun này cung cấp hai chức năng và một ngoại lệ để cho phép phân tích cú pháp đối số dòng lệnh

getopt. phương pháp getopt

Phương pháp này phân tích các tùy chọn dòng lệnh và danh sách tham số. Sau đây là cú pháp đơn giản cho phương thức này -

getopt.getopt(args, options, [long_options])

Đây là chi tiết của các tham số -

  • args - Đây là danh sách đối số sẽ được phân tích cú pháp

  • tùy chọn − Đây là chuỗi ký tự tùy chọn mà tập lệnh muốn nhận dạng, với các tùy chọn yêu cầu đối số phải được theo sau bởi dấu hai chấm (. )

  • long_options - Đây là tham số tùy chọn và nếu được chỉ định, phải là danh sách các chuỗi có tên của các tùy chọn dài, sẽ được hỗ trợ. Các tùy chọn dài, yêu cầu một đối số phải được theo sau bởi dấu bằng ('='). Để chỉ chấp nhận các tùy chọn dài, các tùy chọn phải là một chuỗi rỗng

  • Phương thức này trả về giá trị bao gồm hai phần tử. đầu tiên là danh sách các cặp (tùy chọn, giá trị). Thứ hai là danh sách các đối số chương trình còn lại sau khi danh sách tùy chọn bị loại bỏ

  • Mỗi cặp tùy chọn-và-giá trị được trả về có tùy chọn làm thành phần đầu tiên của nó, bắt đầu bằng dấu gạch nối cho các tùy chọn ngắn (e. g. , '-x') hoặc hai dấu gạch ngang cho các tùy chọn dài (e. g. , '--long-option')

getopt ngoại lệ. GetoptError

Điều này xảy ra khi một tùy chọn không được công nhận được tìm thấy trong danh sách đối số hoặc khi một tùy chọn yêu cầu đối số không được đưa ra

Đối số cho ngoại lệ là một chuỗi cho biết nguyên nhân gây ra lỗi. Các thuộc tính msg và opt đưa ra thông báo lỗi và tùy chọn liên quan

Thí dụ

Hãy xem xét chúng tôi muốn chuyển hai tên tệp qua dòng lệnh và chúng tôi cũng muốn cung cấp tùy chọn để kiểm tra việc sử dụng tập lệnh. Cách sử dụng tập lệnh như sau -

Chúng tôi có một chương trình ở đây có tên là

$ python3 add_old.py 3 4
7.0
1 sử dụng mô-đun
$ python3 add_old.py 3 4
7.0
2 của Python để phân tích hai đối số,
$ python3 add_old.py 3 4
7.0
3 và
$ python3 add_old.py 3 4
7.0
4

________số 8

Khi được gọi, nó chuyển đổi các đối số thành số dấu chấm động và sau đó cộng chúng lại

Bây giờ, chúng tôi có rất nhiều mã ở đây chỉ để phân tích hai đối số dòng lệnh. Tại sao chúng tôi sử dụng

$ python3 add_old.py 3 4
7.0
2 cho việc này?

Tại sao không sử dụng $ python3 add_old.py 3 4 7.0 6 để nhận đối số dòng lệnh?

Thay vì tất cả mã đó, chúng ta chỉ cần đọc

$ python3 add_old.py 3 4
7.0
6 (là danh sách tất cả các đối số dòng lệnh dưới dạng chuỗi) và sau đó chuyển đổi hai đối số dự kiến ​​của chúng ta thành số dấu phẩy động

$ python test.py arg1 arg2 arg3
2

Như bạn có thể thấy, điều này không làm việc

$ python3 add_old.py 3 4
7.0

Nhưng nhược điểm của việc làm theo cách này là, nếu chúng ta mắc lỗi khi gọi chương trình dòng lệnh này, chúng ta sẽ không thấy các thông báo lỗi rất hữu ích

Ví dụ: nếu chúng ta chuyển quá ít đối số thì Python không thực sự cho chúng ta biết nhiều về những gì đang diễn ra

$ python test.py arg1 arg2 arg3
4

Tương tự, nếu chúng tôi chuyển vào thứ gì đó không phải là số, chúng tôi chỉ nhận được một thông báo lỗi hơi hữu ích

$ python test.py arg1 arg2 arg3
5

Và nếu chúng tôi yêu cầu trợ giúp, chúng tôi sẽ không nhận được thông tin hữu ích nào cả

$ python test.py arg1 arg2 arg3
6

Trong tất cả các trường hợp này, chúng tôi thấy một dấu vết không hữu ích được in ra thay vì một thông báo lỗi hữu ích. Trong tất cả các trường hợp này, thay vào đó, mô-đun

$ python3 add_old.py 3 4
7.0
2 của Python sẽ in ra thông báo lỗi hữu ích trong tất cả các trường hợp này

So sánh $ python3 add_old.py 3 4 7.0 2 với cách đọc thủ công $ python3 add_old.py 3 4 7.0 6

Đây là chương trình dòng lệnh của chúng tôi trước đó sử dụng

$ python3 add_old.py 3 4
7.0
2

________số 8

Khi chúng tôi yêu cầu chương trình này trợ giúp (bằng cách chuyển đối số

$ python test.py arg1 arg2 arg3
42), nó sẽ hiển thị cho chúng tôi thông tin sử dụng

Number of arguments: 4 arguments.
Argument List: ['test.py', 'arg1', 'arg2', 'arg3']
3

Nếu chúng tôi phân tích quá ít đối số, nó sẽ cho chúng tôi biết rằng có một đối số khác được yêu cầu

Number of arguments: 4 arguments.
Argument List: ['test.py', 'arg1', 'arg2', 'arg3']
4

Tương tự, nếu chúng ta nhập sai giá trị cho một đối số (không phải là số), điều đó cho chúng ta biết rằng đối số của chúng ta không thể được chuyển đổi thành số dấu phẩy động

Number of arguments: 4 arguments.
Argument List: ['test.py', 'arg1', 'arg2', 'arg3']
5

Mô-đun

$ python3 add_old.py 3 4
7.0
2 thực sự tiện dụng để tạo giao diện dòng lệnh thân thiện

Nhưng

$ python3 add_old.py 3 4
7.0
2 không chỉ dành cho các giao diện dòng lệnh đơn giản như giao diện này, chúng ta cũng có thể chấp nhận các đối số tùy chọn bằng cách sử dụng
$ python3 add_old.py 3 4
7.0
2

Chấp nhận đối số dòng lệnh tùy chọn

Phiên bản này của chương trình

$ python3 add_old.py 3 4
7.0
1 của chúng tôi chấp nhận một đối số
$ python test.py arg1 arg2 arg3
47 hoặc
$ python test.py arg1 arg2 arg3
48 tùy chọn

$ python test.py arg1 arg2 arg3
20

Dòng mã này thêm một tùy chọn, đó là đối số tùy chọn, vào trình phân tích cú pháp dòng lệnh của chúng tôi

$ python test.py arg1 arg2 arg3
21

Khi chạy chương trình này, đối số tùy chọn này có thể được chỉ định bằng

$ python test.py arg1 arg2 arg3
49 hoặc
$ python test.py arg1 arg2 arg3
50

Nếu đối số dự kiến ​​này không được cung cấp thì nó sẽ mặc định là giá trị

$ python test.py arg1 arg2 arg3
51

Khi đối số

$ python test.py arg1 arg2 arg3
52 này không phải là
$ python test.py arg1 arg2 arg3
51, chúng tôi kiểm tra xem nó có bằng với
$ python test.py arg1 arg2 arg3
54 (là tổng của các đối số
$ python3 add_old.py 3 4
7.0
3 và
$ python3 add_old.py 3 4
7.0
4 của chúng tôi)

$ python test.py arg1 arg2 arg3
22

Ví dụ: nếu chúng tôi chuyển vào

$ python test.py arg1 arg2 arg3
57 và
$ python test.py arg1 arg2 arg3
58 và giá trị dự kiến ​​là
$ python test.py arg1 arg2 arg3
59, chúng tôi sẽ không thấy bất kỳ nội dung nào được in ra (vì
$ python test.py arg1 arg2 arg3
60 là
$ python test.py arg1 arg2 arg3
59)

Chúng tôi cũng có thể đã chỉ định đối số dự kiến ​​đó với

$ python test.py arg1 arg2 arg3
62 thay vì
$ python test.py arg1 arg2 arg3
48

$ python test.py arg1 arg2 arg3
23

Đối số này có thể hơi ngớ ngẩn, nhưng chúng ta có thể sử dụng nó để xác nhận các vấn đề với phép cộng dấu phẩy động

Chẳng hạn, chúng tôi đang thêm

$ python test.py arg1 arg2 arg3
64 và
$ python test.py arg1 arg2 arg3
65 để kiểm tra xem nó có chính xác bằng
$ python test.py arg1 arg2 arg3
66 hay không (không phải vậy)

$ python test.py arg1 arg2 arg3
24

Sự bổ sung này cho chúng tôi một số rất gần với

$ python test.py arg1 arg2 arg3
66 (nhưng không chính xác là
$ python test.py arg1 arg2 arg3
66) nên chúng tôi thấy một thông báo lỗi được in ra

Đối số dòng lệnh tùy chọn không có giá trị

Chúng tôi cũng có thể tạo các đối số dòng lệnh tùy chọn không chấp nhận giá trị

Trong phiên bản

$ python3 add_old.py 3 4
7.0
1 này, chúng tôi chấp nhận đối số
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('x', type=float)
parser.add_argument('y', type=float)
args = parser.parse_args()

print(args.x + args.y)
0 tùy chọn

$ python test.py arg1 arg2 arg3
25

Sự hiện diện đơn thuần của một đối số

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('x', type=float)
parser.add_argument('y', type=float)
args = parser.parse_args()

print(args.x + args.y)
0 sẽ lưu trữ giá trị
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('x', type=float)
parser.add_argument('y', type=float)
args = parser.parse_args()

print(args.x + args.y)
2

$ python test.py arg1 arg2 arg3
26

Nếu đối số đó không được đưa ra, thuộc tính

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('x', type=float)
parser.add_argument('y', type=float)
args = parser.parse_args()

print(args.x + args.y)
3 sẽ là một cái gì đó sai (xem tính trung thực) và nếu nó được đưa ra, chúng ta sẽ nhận được
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('x', type=float)
parser.add_argument('y', type=float)
args = parser.parse_args()

print(args.x + args.y)
2

$ python test.py arg1 arg2 arg3
27

Vì vậy, khi đối số

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('x', type=float)
parser.add_argument('y', type=float)
args = parser.parse_args()

print(args.x + args.y)
0 được đưa ra, chương trình của chúng tôi sẽ in ra các số mà chúng tôi đang cộng lại với nhau

$ python test.py arg1 arg2 arg3
28

Khi

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('x', type=float)
parser.add_argument('y', type=float)
args = parser.parse_args()

print(args.x + args.y)
0 không được cung cấp, chương trình của chúng tôi thực hiện chính xác những gì nó đã làm trước đây

Thêm tài liệu cho giao diện dòng lệnh sử dụng $ python3 add_old.py 3 4 7.0 2

Mô-đun

$ python3 add_old.py 3 4
7.0
2 cũng cho phép bạn thêm tài liệu cho giao diện dòng lệnh của mình

Đây là một phiên bản nữa của chương trình

$ python3 add_old.py 3 4
7.0
1 của chúng tôi với rất nhiều văn bản trợ giúp được thêm vào

$ python test.py arg1 arg2 arg3
29

Nếu người dùng cuối yêu cầu trợ giúp khi chạy chương trình này, họ sẽ thấy một số thông tin sử dụng rất hữu ích

$ python3 add_old.py 3 4
7.0
0

Thông tin sử dụng này cho người dùng cuối biết rằng chương trình này

  1. Sẽ "cộng hai số với nhau"
  2. Chấp nhận hai đối số vị trí, "số đầu tiên cần thêm" và "số thứ hai cần thêm"
  3. Chấp nhận đối số
    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('x', type=float)
    parser.add_argument('y', type=float)
    args = parser.parse_args()
    
    print(args.x + args.y)
    
    0 để "hiển thị thêm ngữ cảnh"

Bản tóm tắt

Nếu bạn đang cố gắng tạo giao diện dòng lệnh thân thiện trong Python, bạn có thể sử dụng

$ python3 add_old.py 3 4
7.0
2 (có trong thư viện chuẩn của Python)

Mô-đun

$ python3 add_old.py 3 4
7.0
2 tạo ra các giao diện dòng lệnh tiêu chuẩn khá điển hình hoặc bình thường trên Linux, Mac và Windows

Sys argv hoạt động như thế nào trong Python?

sys. argv là danh sách các đối số dòng lệnh được truyền cho chương trình Python. argv đại diện cho tất cả các mục xuất hiện thông qua đầu vào dòng lệnh , về cơ bản nó là một mảng chứa các đối số dòng lệnh của chương trình của chúng ta. Đừng quên rằng việc đếm bắt đầu từ số không (0) chứ không phải một (1).

Phân tích cú pháp có nghĩa là gì trong Python?

Phân tích cú pháp được định nghĩa là quá trình chuyển đổi mã sang ngôn ngữ máy để phân tích cú pháp chính xác của mã . Python cung cấp một thư viện được gọi là trình phân tích cú pháp.

parse_args trả về cái gì?

parse_args() trả về hai giá trị. các tùy chọn, một đối tượng chứa các giá trị cho tất cả các tùy chọn của bạn — e. g. nếu "--file" nhận một đối số chuỗi đơn, thì các tùy chọn. tệp sẽ là tên tệp do người dùng cung cấp hoặc Không có nếu người dùng không cung cấp tùy chọn đó.