Hướng dẫn can we pass list as command line argument in python? - chúng ta có thể chuyển danh sách dưới dạng đối số dòng lệnh trong python không?

Đối số dòng lệnh luôn được truyền dưới dạng chuỗi. Bạn sẽ cần phải phân tích chúng vào kiểu dữ liệu cần thiết của bạn.

Show
>>> input = "[2,3,4,5]"
>>> map(float, input.strip('[]').split(','))
[2.0, 3.0, 4.0, 5.0]
>>> A = map(float, input.strip('[]').split(','))
>>> print(A, type(A))
([2.0, 3.0, 4.0, 5.0], )

Có các thư viện như Argparse và nhấp cho phép bạn xác định chuyển đổi loại đối số của riêng bạn nhưng

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
9 xử lý
$ python main.py Python Command Line Arguments
Arguments count: 5
Argument      0: main.py
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
0 giống như
$ python main.py Python Command Line Arguments
Arguments count: 5
Argument      0: main.py
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
1
$ python main.py Python Command Line Arguments
Arguments count: 5
Argument      0: main.py
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
2
$ python main.py Python Command Line Arguments
Arguments count: 5
Argument      0: main.py
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
3
$ python main.py Python Command Line Arguments
Arguments count: 5
Argument      0: main.py
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
4
$ python main.py Python Command Line Arguments
Arguments count: 5
Argument      0: main.py
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
3
$ python main.py Python Command Line Arguments
Arguments count: 5
Argument      0: main.py
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
6
$ python main.py Python Command Line Arguments
Arguments count: 5
Argument      0: main.py
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
7 Vì vậy, tôi nghi ngờ nó sẽ hữu ích.

Chỉnh sửa tháng 1 năm 2019 Câu trả lời này dường như vẫn có một chút hành động vì vậy tôi sẽ thêm một tùy chọn khác được lấy trực tiếp từ các tài liệu Argparse.

Bạn có thể sử dụng

$ python main.py Python Command Line Arguments
Arguments count: 5
Argument      0: main.py
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
8 để cho phép thu thập các đối số lặp đi lặp lại vào một danh sách duy nhất.

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])

Trong trường hợp này, bạn sẽ vượt qua

$ python main.py Python Command Line Arguments
Arguments count: 5
Argument      0: main.py
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
9 một lần cho mỗi mục danh sách. Sử dụng ví dụ Ops:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
00 sẽ dẫn đến
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
01

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để làm sâu sắc thêm sự hiểu biết của bạn: Giao diện dòng lệnh trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Command Line Interfaces in Python

Tôi có thể truyền một danh sách như một python đối số không?Python command line arguments provides a user-friendly interface to your text-based command line program. It’s similar to what a graphical user interface is for a visual application that’s manipulated by graphical elements or widgets.

Bạn có thể gửi bất kỳ loại dữ liệu nào của đối số đến một hàm (chuỗi, số, danh sách, từ điển, v.v.) và nó sẽ được coi là cùng một loại dữ liệu bên trong hàm.

Là danh sách các đối số dòng lệnh?

  • sys.argv là danh sách các đối số dòng lệnh. Len (sys.argv) là số lượng đối số dòng lệnh. of Python command line arguments
  • Bạn có thể chuyển một danh sách cho * args không? for Python command line arguments
  • Khi chỉ định một danh sách hoặc tuple với * là một đối số, nó được giải nén và mỗi phần tử được truyền cho mỗi đối số. Danh sách được sử dụng trong mã mẫu sau, nhưng tương tự áp dụng cho các bộ dữ liệu. guiding the design of a command line interface
  • Những điều cơ bản để tùy chỉnh thủ công và xử lý các đối số dòng lệnh Python to manually customize and handle Python command line arguments
  • Các thư viện có sẵn trong Python để giảm bớt sự phát triển của giao diện dòng lệnh phức tạp available in Python to ease the development of a complex command line interface

Nếu bạn muốn một cách thân thiện với người dùng để cung cấp các đối số dòng lệnh Python cho chương trình của bạn mà không cần nhập thư viện chuyên dụng hoặc nếu bạn muốn hiểu rõ hơn về cơ sở chung cho các thư viện hiện có dành riêng để xây dựng giao diện dòng lệnh Python, thì hãy giữ Về đọc!

Giao diện dòng lệnh

Giao diện dòng lệnh (CLI) cung cấp một cách để người dùng tương tác với một chương trình chạy trong trình thông dịch shell dựa trên văn bản. Một số ví dụ về phiên dịch shell là bash trên linux hoặc dấu nhắc lệnh trên windows. Giao diện dòng lệnh được kích hoạt bởi trình thông dịch shell để lộ dấu nhắc lệnh. Nó có thể được đặc trưng bởi các yếu tố sau:command line interface (CLI) provides a way for a user to interact with a program running in a text-based shell interpreter. Some examples of shell interpreters are Bash on Linux or Command Prompt on Windows. A command line interface is enabled by the shell interpreter that exposes a command prompt. It can be characterized by the following elements:

  • Một lệnh hoặc chương trìnhcommand or program
  • Không hoặc nhiều đối số dòng lệnharguments
  • Đầu ra đại diện cho kết quả của lệnhoutput representing the result of the command
  • Tài liệu văn bản được gọi là sử dụng hoặc trợ giúpusage or help

Không phải mọi giao diện dòng lệnh có thể cung cấp tất cả các yếu tố này, nhưng danh sách này cũng không phải là toàn bộ. Sự phức tạp của dòng lệnh dao động từ khả năng truyền một đối số duy nhất, đến nhiều đối số và tùy chọn, giống như một ngôn ngữ cụ thể của miền. Ví dụ: một số chương trình có thể khởi chạy tài liệu web từ dòng lệnh hoặc bắt đầu một trình thông dịch shell tương tác như Python.

Hai ví dụ sau với lệnh Python minh họa mô tả giao diện dòng lệnh:

$ python -c "print('Real Python')"
Real Python

Trong ví dụ đầu tiên này, Trình thông dịch Python sử dụng tùy chọn

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
02 cho lệnh, trong đó nói rằng sẽ thực thi các đối số dòng lệnh Python theo tùy chọn
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
02 dưới dạng chương trình Python.command, which says to execute the Python command line arguments following the option
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
02 as a Python program.

Một ví dụ khác cho thấy cách gọi Python với

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
04 để hiển thị trợ giúp:

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]

Hãy thử điều này trong thiết bị đầu cuối của bạn để xem tài liệu trợ giúp hoàn chỉnh.

Di sản c

Các đối số dòng lệnh Python trực tiếp kế thừa từ ngôn ngữ lập trình C. Như Guido Van Rossum đã viết trong phần giới thiệu về Python cho các lập trình viên UNIX/C vào năm 1993, C có ảnh hưởng mạnh mẽ đến Python. Guido đề cập đến các định nghĩa về nghĩa đen, định danh, toán tử và các câu như

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
05,
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
06 hoặc
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
07. Việc sử dụng các đối số dòng lệnh Python cũng bị ảnh hưởng mạnh mẽ bởi ngôn ngữ C.

Để minh họa những điểm tương đồng, hãy xem xét chương trình C sau:

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}

Dòng 4 xác định

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
08, là điểm nhập của chương trình C. Lưu ý tốt về các tham số:

  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    09 là một số nguyên đại diện cho số lượng đối số của chương trình.
    is an integer representing the number of arguments of the program.
  2. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    10 là một loạt các con trỏ cho các ký tự chứa tên của chương trình trong phần tử đầu tiên của mảng, theo sau là các đối số của chương trình, nếu có, trong các phần tử còn lại của mảng.
    is an array of pointers to characters containing the name of the program in the first element of the array, followed by the arguments of the program, if any, in the remaining elements of the array.

Bạn có thể biên dịch mã ở trên trên Linux với

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
11, sau đó thực thi với
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
12 để có được các mục sau:

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main

Trừ khi được thể hiện rõ ràng ở dòng lệnh với tùy chọn

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
13,
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
14 là tên mặc định của trình biên dịch GCC được tạo bởi Trình biên dịch GCC. Nó là viết tắt của đầu ra của trình biên dịch và gợi nhớ đến các tệp thực thi được tạo ra trên các hệ thống UNIX cũ hơn. Quan sát rằng tên của thực thi
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
12 là đối số duy nhất.gcc compiler. It stands for assembler output and is reminiscent of the executables that were generated on older UNIX systems. Observe that the name of the executable
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
12 is the sole argument.

Hãy để thêm vào ví dụ này bằng cách chuyển một vài đối số dòng lệnh Python cho cùng một chương trình:

$ ./main Python Command Line Arguments
Arguments count: 5
Argument      0: ./main
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments

Đầu ra cho thấy số lượng đối số là

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
16 và danh sách các đối số bao gồm tên của chương trình,
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
17, theo sau là mỗi từ của cụm từ
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
18, mà bạn đã chuyển ở dòng lệnh.

Việc tổng hợp

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
19 giả định rằng bạn đã sử dụng hệ thống Linux hoặc Mac OS. Trên Windows, bạn cũng có thể biên dịch chương trình C này với một trong các tùy chọn sau:

  • Hệ thống con Windows cho Linux (WSL): Nó có sẵn trong một vài bản phân phối Linux, như Ubuntu, OpenSuse và Debian, trong số những người khác. Bạn có thể cài đặt nó từ Microsoft Store. It’s available in a few Linux distributions, like Ubuntu, OpenSUSE, and Debian, among others. You can install it from the Microsoft Store.
  • Windows Build Tools: Điều này bao gồm các công cụ xây dựng dòng lệnh Windows, trình biên dịch Microsoft C/C ++
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    20 và đầu trước của trình biên dịch có tên
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    21 cho C/C ++.
    This includes the Windows command line build tools, the Microsoft C/C++ compiler
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    20, and a compiler front end named
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    21 for C/C++.
  • Microsoft Visual Studio: Đây là môi trường phát triển tích hợp chính của Microsoft (IDE). Để tìm hiểu thêm về IDE có thể được sử dụng cho cả Python và C trên các hệ điều hành khác nhau, bao gồm Windows, hãy xem Python IDE và trình chỉnh sửa mã (Hướng dẫn). This is the main Microsoft integrated development environment (IDE). To learn more about IDEs that can be used for both Python and C on various operating systems, including Windows, check out Python IDEs and Code Editors (Guide).
  • Dự án MingW-64: Điều này hỗ trợ trình biên dịch GCC trên Windows. This supports the GCC compiler on Windows.

Nếu bạn đã cài đặt Microsoft Visual Studio hoặc Windows Build Tools, thì bạn có thể biên dịch

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
19 như sau:

Bạn sẽ có được một thực thi có tên

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
23 mà bạn có thể bắt đầu với:

C:/>main
Arguments count: 1
Argument      0: main

Bạn có thể thực hiện một chương trình Python,

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
24, tương đương với chương trình C,
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
19, bạn đã thấy ở trên:

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")

Bạn không thấy một biến

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
09 như trong ví dụ mã C. Nó không tồn tại trong Python vì
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 là đủ. Bạn có thể phân tích các đối số dòng lệnh Python trong
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 mà không cần phải biết độ dài của danh sách và bạn có thể gọi
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
29 tích hợp nếu cần số lượng đối số của chương trình.

Ngoài ra, lưu ý rằng

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
30, khi được áp dụng cho một ITable, trả về một đối tượng
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
31 có thể phát ra các cặp liên kết chỉ số của một phần tử trong
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
32 với giá trị tương ứng của nó. Điều này cho phép lặp qua nội dung của
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 mà không phải duy trì bộ đếm cho chỉ mục trong danh sách.

Thực thi

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
24 như sau:

$ python main.py Python Command Line Arguments
Arguments count: 5
Argument      0: main.py
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 chứa thông tin giống như trong chương trình C:

  • Tên của chương trình
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    24 là mục đầu tiên của danh sách.
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    24 is the first item of the list.
  • Các đối số
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    37,
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    38,
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    39 và
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    40 là các yếu tố còn lại trong danh sách.
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    37,
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    38,
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    39, and
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    40 are the remaining elements in the list.

Với phần giới thiệu ngắn gọn này về một vài khía cạnh phức tạp của ngôn ngữ C, giờ đây bạn đã được trang bị một số kiến ​​thức có giá trị để nắm bắt thêm các đối số dòng lệnh Python.

Hai tiện ích từ thế giới Unix

Để sử dụng các đối số dòng lệnh Python trong hướng dẫn này, bạn sẽ thực hiện một số tính năng một phần của hai tiện ích từ hệ sinh thái UNIX:

  1. sha1sum
  2. SEQ

Bạn sẽ có được một số quen thuộc với các công cụ UNIX này trong các phần sau.

>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append') >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['1', '2']) 41

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41 Tính toán các băm SHA-1 và nó thường được sử dụng để xác minh tính toàn vẹn của các tệp. Đối với một đầu vào đã cho, một hàm băm luôn trả về cùng một giá trị. Bất kỳ thay đổi nhỏ trong đầu vào sẽ dẫn đến một giá trị băm khác nhau. Trước khi bạn sử dụng tiện ích với các tham số cụ thể, bạn có thể cố gắng hiển thị trợ giúp:hash function always returns the same value. Any minor changes in the input will result in a different hash value. Before you use the utility with concrete parameters, you may try to display the help:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
0

Hiển thị trợ giúp của chương trình dòng lệnh là một tính năng phổ biến được phơi bày trong giao diện dòng lệnh.

Để tính toán giá trị băm SHA-1 của nội dung của tệp, bạn tiến hành như sau:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
1

Kết quả cho thấy giá trị băm SHA-1 là trường đầu tiên và tên của tệp là trường thứ hai. Lệnh có thể lấy nhiều hơn một tệp làm đối số:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
2

Nhờ tính năng mở rộng Wildcards của thiết bị đầu cuối UNIX, nó cũng có thể cung cấp các đối số dòng lệnh Python với các ký tự ký tự đại diện. Một nhân vật như vậy là dấu hoa thị hoặc sao (

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
43):

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
3

Shell chuyển đổi

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
44 thành
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
19 và
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
24, là hai tệp phù hợp với mẫu
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
44 trong thư mục hiện tại và chuyển chúng đến
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41. Chương trình tính toán băm SHA1 của từng tệp trong danh sách đối số. Bạn có thể thấy rằng, trên Windows, hành vi là khác nhau. Windows không có sự mở rộng ký tự đại diện, vì vậy chương trình có thể phải phù hợp với điều đó. Việc thực hiện của bạn có thể cần phải mở rộng ký tự đại diện trong nội bộ.SHA1 hash of each of the files in the argument list. You’ll see that, on Windows, the behavior is different. Windows has no wildcard expansion, so the program may have to accommodate for that. Your implementation may need to expand wildcards internally.

Không có bất kỳ đối số nào,

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41 đọc từ đầu vào tiêu chuẩn. Bạn có thể cung cấp dữ liệu cho chương trình bằng cách nhập các ký tự trên bàn phím. Đầu vào có thể kết hợp bất kỳ ký tự nào, bao gồm cả vận chuyển trở lại Enter. Để chấm dứt đầu vào, bạn phải báo hiệu phần cuối của tệp với Enter, theo sau là chuỗi Ctrl+D:Enter. To terminate the input, you must signal the end of file with Enter, followed by the sequence Ctrl+D:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
4

Trước tiên, bạn nhập tên của chương trình,

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41, tiếp theo là Enter, và sau đó
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
51 và
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
37, mỗi người cũng theo sau là Enter. Để đóng luồng đầu vào, bạn nhập ctrl+d. Kết quả là giá trị của băm SHA1 được tạo cho văn bản
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
53. Tên của tệp là
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
54. Đây là một quy ước để chỉ ra đầu vào tiêu chuẩn. Giá trị băm giống nhau khi bạn thực hiện các lệnh sau:Enter, and then
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
51 and
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
37, each also followed by Enter. To close the input stream, you type Ctrl+D. The result is the value of the SHA1 hash generated for the text
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
53. The name of the file is
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
54. This is a convention to indicate the standard input. The hash value is the same when you execute the following commands:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
5

Tiếp theo, bạn sẽ đọc một mô tả ngắn về

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55.

>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append') >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['1', '2']) 55

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55 tạo ra một chuỗi các số. Ở dạng cơ bản nhất của nó, như tạo ra chuỗi từ 1 đến 5, bạn có thể thực hiện các mục sau:sequence of numbers. In its most basic form, like generating the sequence from 1 to 5, you can execute the following:

Để có được cái nhìn tổng quan về các khả năng được phơi bày bởi

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55, bạn có thể hiển thị trợ giúp tại dòng lệnh:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
6

Đối với hướng dẫn này, bạn sẽ viết một vài biến thể đơn giản hóa là

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41 và
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55. Trong mỗi ví dụ, bạn sẽ học một khía cạnh khác nhau hoặc kết hợp các tính năng về các đối số dòng lệnh Python.

Trên Mac OS và Linux,

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41 và
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55 sẽ được cài đặt sẵn, mặc dù các tính năng và thông tin trợ giúp đôi khi có thể khác nhau một chút giữa các hệ thống hoặc phân phối. Nếu bạn sử dụng Windows 10, thì phương pháp thuận tiện nhất là chạy
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41 và
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55 trong môi trường Linux được cài đặt trên WSL. Nếu bạn không có quyền truy cập vào một thiết bị đầu cuối để hiển thị các tiện ích UNIX tiêu chuẩn, thì bạn có thể có quyền truy cập vào các thiết bị đầu cuối trực tuyến:

  • Tạo một tài khoản miễn phí trên Pythonanywhere và bắt đầu một bảng điều khiển bash. a free account on PythonAnywhere and start a Bash Console.
  • Tạo một thiết bị đầu cuối bash tạm thời trên repl.it. a temporary Bash terminal on repl.it.

Đây là hai ví dụ, và bạn có thể tìm thấy những người khác.

Mảng >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append') >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['1', '2']) 27

Trước khi khám phá một số quy ước được chấp nhận và khám phá cách xử lý các đối số dòng lệnh Python, bạn cần biết rằng hỗ trợ cơ bản cho tất cả các đối số dòng lệnh Python được cung cấp bởi

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27. Các ví dụ trong các phần sau đây cho bạn biết cách xử lý các đối số dòng lệnh Python được lưu trữ trong
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 và để khắc phục các vấn đề điển hình xảy ra khi bạn cố gắng truy cập chúng. Bạn sẽ học:

  • Cách truy cập nội dung của
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27access the content of
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27
  • Cách giảm thiểu tác dụng phụ của bản chất toàn cầu của
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27mitigate the side effects of the global nature of
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27
  • Cách xử lý khoảng trắng trong các đối số dòng lệnh Pythonprocess whitespaces in Python command line arguments
  • Cách xử lý lỗi trong khi truy cập các đối số dòng lệnh Pythonhandle errors while accessing Python command line arguments
  • Cách ăn định dạng ban đầu của các đối số dòng lệnh Python được truyền qua byteingest the original format of the Python command line arguments passed by bytes

Bắt đầu nào!

Hiển thị đối số

Mô -đun

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
70 hiển thị một mảng có tên
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
10 bao gồm các mục sau:

  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    72 chứa tên của chương trình Python hiện tại.
    contains the name of the current Python program.
  2. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    73, phần còn lại của danh sách, chứa bất kỳ và tất cả các đối số dòng lệnh Python được chuyển cho chương trình.
    , the rest of the list, contains any and all Python command line arguments passed to the program.

Ví dụ sau đây cho thấy nội dung của

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
7

Ở đây, cách thức hoạt động của mã này:

  • Dòng 2 nhập mô -đun Python nội bộ
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    70.
    imports the internal Python module
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    70.
  • Dòng 4 trích xuất tên của chương trình bằng cách truy cập phần tử đầu tiên của danh sách
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27.
    extracts the name of the program by accessing the first element of the list
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27.
  • Dòng 5 hiển thị các đối số dòng lệnh Python bằng cách tìm nạp tất cả các yếu tố còn lại của danh sách
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27.
    displays the Python command line arguments by fetching all the remaining elements of the list
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27.

Thực hiện tập lệnh

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
78 ở trên với danh sách các đối số tùy ý như sau:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
8

Đầu ra xác nhận rằng nội dung của

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
79 là tập lệnh Python
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
78 và các yếu tố còn lại của danh sách
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 chứa các đối số của tập lệnh,
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
82.

Để tóm tắt,

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 chứa tất cả các đối số dòng lệnh Python
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
78. Khi trình thông dịch Python thực hiện chương trình Python, nó phân tích dòng lệnh và điền vào
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 với các đối số.

Đảo ngược đối số đầu tiên

Bây giờ bạn có đủ nền trên

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27, bạn sẽ hoạt động trên các đối số được truyền ở dòng lệnh. Ví dụ
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
87 đảo ngược đối số đầu tiên được truyền ở dòng lệnh:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
9

Trong

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
87, quá trình đảo ngược đối số đầu tiên được thực hiện với các bước sau:

  • Dòng 5 tìm kiếm đối số đầu tiên của chương trình được lưu trữ tại Index
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    89 của
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27. Hãy nhớ rằng tên chương trình được lưu trữ tại Index
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    91 của
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27.
    fetches the first argument of the program stored at index
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    89 of
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27. Remember that the program name is stored at index
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    91 of
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27.
  • Dòng 6 in chuỗi đảo ngược.
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    93 là một cách pythonic để sử dụng một thao tác lát cắt để đảo ngược danh sách.
    prints the reversed string.
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    93 is a Pythonic way to use a slice operation to reverse a list.

Bạn thực thi tập lệnh như sau:

$ python -c "print('Real Python')"
Real Python
0

Đúng như dự đoán,

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
87 hoạt động trên
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
95 và đảo ngược đối số duy nhất để xuất ra
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
96. Lưu ý rằng xung quanh chuỗi đa từ
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
95 với các trích dẫn đảm bảo rằng trình thông dịch xử lý nó như một đối số duy nhất, thay vì hai đối số. Bạn sẽ đi sâu vào các dấu phân cách đối số trong một phần sau.argument separators in a later section.

Đột biến >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append') >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['1', '2']) 27

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 có sẵn trên toàn cầu cho chương trình Python đang chạy của bạn. Tất cả các mô -đun được nhập trong quá trình thực hiện quy trình đều có quyền truy cập trực tiếp vào
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27. Truy cập toàn cầu này có thể thuận tiện, nhưng
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 không phải là bất biến. Bạn có thể muốn thực hiện một cơ chế đáng tin cậy hơn để đưa các đối số chương trình đến các mô -đun khác nhau trong chương trình Python của bạn, đặc biệt là trong một chương trình phức tạp với nhiều tệp.globally available to your running Python program. All modules imported during the execution of the process have direct access to
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27. This global access might be convenient, but
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 isn’t immutable. You may want to implement a more reliable mechanism to expose program arguments to different modules in your Python program, especially in a complex program with multiple files.

Quan sát những gì xảy ra nếu bạn giả mạo

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27:

$ python -c "print('Real Python')"
Real Python
1

Bạn gọi

$ python -c "print('Real Python')"
Real Python
03 để xóa và trả lại mục cuối cùng trong
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27.

Thực hiện tập lệnh ở trên:

$ python -c "print('Real Python')"
Real Python
2

Lưu ý rằng đối số thứ tư không còn được bao gồm trong

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27.

Trong một kịch bản ngắn, bạn có thể dựa vào quyền truy cập toàn cầu vào

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27, nhưng trong một chương trình lớn hơn, bạn có thể muốn lưu trữ các đối số trong một biến riêng biệt. Ví dụ trước có thể được sửa đổi như sau:

$ python -c "print('Real Python')"
Real Python
3

Lần này, mặc dù

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 bị mất yếu tố cuối cùng,
$ python -c "print('Real Python')"
Real Python
08 đã được bảo tồn một cách an toàn.
$ python -c "print('Real Python')"
Real Python
08 là toàn cầu và bạn có thể vượt qua nó để phân tích các đối số theo logic của chương trình của bạn. Trình quản lý gói Python,
$ python -c "print('Real Python')"
Real Python
10, sử dụng phương pháp này. Tại đây, một đoạn trích ngắn của mã nguồn
$ python -c "print('Real Python')"
Real Python
10:

$ python -c "print('Real Python')"
Real Python
4

Trong đoạn mã này được lấy từ mã nguồn

$ python -c "print('Real Python')"
Real Python
10,
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
08 lưu vào
$ python -c "print('Real Python')"
Real Python
08, lát cắt của
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 chỉ chứa các đối số chứ không phải tên tệp.
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 vẫn chưa được xử lý và
$ python -c "print('Real Python')"
Real Python
08 bị ảnh hưởng bởi bất kỳ thay đổi vô tình nào đối với
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27.

Thoát khỏi các ký tự khoảng trắng

Trong ví dụ

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
87 mà bạn đã thấy trước đó, đối số đầu tiên và duy nhất là
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
95 và kết quả là
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
96. Đối số bao gồm một khoảng cách khoảng trắng giữa
$ python -c "print('Real Python')"
Real Python
22 và
$ python -c "print('Real Python')"
Real Python
23, và nó cần phải được thoát ra.

Trên Linux, khoảng trắng có thể được thoát ra bằng cách thực hiện một trong những điều sau đây:

  1. Xung quanh các đối số với các trích dẫn đơn (
    $ python -c "print('Real Python')"
    Real Python
    
    24)
    the arguments with single quotes (
    $ python -c "print('Real Python')"
    Real Python
    
    24)
  2. Xung quanh các đối số với dấu ngoặc kép (
    $ python -c "print('Real Python')"
    Real Python
    
    25)
    the arguments with double quotes (
    $ python -c "print('Real Python')"
    Real Python
    
    25)
  3. Tiền tố mỗi không gian với dấu gạch chéo ngược (
    $ python -c "print('Real Python')"
    Real Python
    
    26)
    each space with a backslash (
    $ python -c "print('Real Python')"
    Real Python
    
    26)

Không có một trong các giải pháp thoát,

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
87 lưu trữ hai đối số,
$ python -c "print('Real Python')"
Real Python
22 trong
$ python -c "print('Real Python')"
Real Python
29 và
$ python -c "print('Real Python')"
Real Python
23 trong
$ python -c "print('Real Python')"
Real Python
31:

$ python -c "print('Real Python')"
Real Python
5

Đầu ra ở trên cho thấy tập lệnh chỉ đảo ngược

$ python -c "print('Real Python')"
Real Python
22 và
$ python -c "print('Real Python')"
Real Python
23 bị bỏ qua. Để đảm bảo cả hai đối số được lưu trữ, bạn cần phải bao quanh chuỗi tổng thể với các trích dẫn kép (
$ python -c "print('Real Python')"
Real Python
25).

Bạn cũng có thể sử dụng dấu gạch chéo ngược (

$ python -c "print('Real Python')"
Real Python
26) để thoát khỏi khoảng trắng:

$ python -c "print('Real Python')"
Real Python
6

Với dấu gạch chéo ngược (

$ python -c "print('Real Python')"
Real Python
26), Shell lệnh hiển thị một đối số duy nhất cho Python, và sau đó là
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
87.

Trong các shell UNIX, bộ phân cách trường nội bộ (IFS) định nghĩa các ký tự được sử dụng làm dấu phân cách. Nội dung của biến shell,

$ python -c "print('Real Python')"
Real Python
38, có thể được hiển thị bằng cách chạy lệnh sau:delimiters. The content of the shell variable,
$ python -c "print('Real Python')"
Real Python
38, can be displayed by running the following command:

$ python -c "print('Real Python')"
Real Python
7

Từ kết quả ở trên,

$ python -c "print('Real Python')"
Real Python
39, bạn xác định ba dấu phân cách:

  1. Không gian (
    $ python -c "print('Real Python')"
    Real Python
    
    40)
    (
    $ python -c "print('Real Python')"
    Real Python
    
    40)
  2. Tab (
    $ python -c "print('Real Python')"
    Real Python
    
    41)
    (
    $ python -c "print('Real Python')"
    Real Python
    
    41)
  3. NEWLINE (
    $ python -c "print('Real Python')"
    Real Python
    
    42)
    (
    $ python -c "print('Real Python')"
    Real Python
    
    42)

Tiền tố một không gian có dấu gạch chéo ngược (

$ python -c "print('Real Python')"
Real Python
26) bỏ qua hành vi mặc định của không gian dưới dạng dấu phân cách trong chuỗi
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
95. Điều này dẫn đến một khối văn bản như dự định, thay vì hai.

Lưu ý rằng, trên Windows, giải thích khoảng trắng có thể được quản lý bằng cách sử dụng kết hợp các trích dẫn kép. Nó có một chút phản trực giác bởi vì, trong thiết bị đầu cuối Windows, một trích dẫn kép (

$ python -c "print('Real Python')"
Real Python
25) được hiểu là một công tắc để vô hiệu hóa và sau đó để kích hoạt các ký tự đặc biệt như không gian, tab hoặc ống (
$ python -c "print('Real Python')"
Real Python
46).space, tab, or pipe (
$ python -c "print('Real Python')"
Real Python
46).

Kết quả là, khi bạn bao quanh nhiều hơn một chuỗi với dấu ngoặc kép, thiết bị đầu cuối Windows diễn giải trích dẫn kép đầu tiên như một lệnh để bỏ qua các ký tự đặc biệt và trích dẫn đôi thứ hai là một để giải thích các ký tự đặc biệt.ignore special characters and the second double quote as one to interpret special characters.

Với thông tin này, nó có thể an toàn khi cho rằng xung quanh nhiều hơn một chuỗi với các trích dẫn kép sẽ cung cấp cho bạn hành vi mong đợi, đó là phơi bày nhóm các chuỗi như một đối số duy nhất. Để xác nhận hiệu ứng đặc biệt này của trích dẫn kép trên dòng lệnh Windows, hãy quan sát hai ví dụ sau:

$ python -c "print('Real Python')"
Real Python
8

Trong ví dụ trên, bạn có thể suy luận trực giác rằng

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
95 được hiểu là một đối số duy nhất. Tuy nhiên, nhận ra những gì xảy ra khi bạn sử dụng một trích dẫn kép duy nhất:

$ python -c "print('Real Python')"
Real Python
9

Lời nhắc lệnh chuyển toàn bộ chuỗi

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
95 như một đối số duy nhất, theo cách tương tự như thể đối số là
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
95. Trong thực tế, lời nhắc lệnh Windows coi báo giá kép duy nhất là một công tắc để vô hiệu hóa hành vi của khoảng trắng làm dấu phân cách và chuyển bất cứ thứ gì theo trích dẫn kép như một đối số duy nhất.

Để biết thêm thông tin về các hiệu ứng của trích dẫn kép trong thiết bị đầu cuối Windows, hãy xem một cách tốt hơn để hiểu trích dẫn và thoát khỏi các đối số dòng lệnh Windows.

Xử lý lỗi

Đối số dòng lệnh Python là chuỗi lỏng lẻo. Nhiều điều có thể sai, vì vậy, một ý tưởng tốt để cung cấp cho người dùng chương trình của bạn một số hướng dẫn trong trường hợp họ vượt qua các đối số không chính xác tại dòng lệnh. Ví dụ:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
87 mong đợi một đối số và nếu bạn bỏ qua nó, thì bạn sẽ gặp lỗi:loose strings. Many things can go wrong, so it’s a good idea to provide the users of your program with some guidance in the event they pass incorrect arguments at the command line. For example,
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
87 expects one argument, and if you omit it, then you get an error:

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
0

Ngoại lệ Python

$ python -c "print('Real Python')"
Real Python
51 được nâng lên và dấu vết tương ứng cho thấy lỗi được gây ra bởi biểu thức
$ python -c "print('Real Python')"
Real Python
52. Thông điệp của ngoại lệ là
$ python -c "print('Real Python')"
Real Python
53. Bạn đã không vượt qua một đối số ở dòng lệnh, vì vậy, không có gì trong danh sách
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 tại Index
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
89.

Đây là một mô hình phổ biến có thể được giải quyết theo một vài cách khác nhau. Đối với ví dụ ban đầu này, bạn sẽ giữ nó ngắn gọn bằng cách bao gồm biểu thức

$ python -c "print('Real Python')"
Real Python
52 trong khối
$ python -c "print('Real Python')"
Real Python
57. Sửa đổi mã như sau:

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
1

Biểu thức trên dòng 4 được bao gồm trong khối

$ python -c "print('Real Python')"
Real Python
57. Dòng 8 làm tăng ngoại lệ tích hợp
$ python -c "print('Real Python')"
Real Python
59. Nếu không có đối số nào được chuyển đến
$ python -c "print('Real Python')"
Real Python
60, thì quá trình này thoát ra với mã trạng thái là
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
89 sau khi in cách sử dụng. Lưu ý sự tích hợp của
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
79 trong thông báo lỗi. Nó phơi bày tên của chương trình trong thông báo sử dụng. Bây giờ, khi bạn thực hiện cùng một chương trình mà không có bất kỳ đối số dòng lệnh Python nào, bạn có thể thấy đầu ra sau:

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
2

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
87 didn có một cuộc tranh luận được thông qua tại dòng lệnh. Do đó, chương trình tăng
$ python -c "print('Real Python')"
Real Python
59 với thông báo lỗi. Điều này khiến chương trình thoát với trạng thái
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
89, hiển thị khi bạn in biến đặc biệt
$ python -c "print('Real Python')"
Real Python
66 với
$ python -c "print('Real Python')"
Real Python
67.

Tính toán >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append') >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['1', '2']) 41

Bạn có thể viết một tập lệnh khác để chứng minh rằng, trên các hệ thống giống như UNIX, các đối số dòng lệnh Python được truyền bởi các byte từ HĐH. Tập lệnh này lấy một chuỗi làm đối số và đưa ra băm Sha-1 thập lục phân của đối số:

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
3

Điều này được truyền cảm hứng một cách lỏng lẻo bởi

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41, nhưng nó cố tình xử lý một chuỗi thay vì nội dung của một tệp. Trong
$ python -c "print('Real Python')"
Real Python
70, các bước để nhập các đối số dòng lệnh Python và để đưa ra kết quả là như sau:

  • Dòng 6 lưu trữ nội dung của đối số đầu tiên trong
    $ python -c "print('Real Python')"
    Real Python
    
    71.
    stores the content of the first argument in
    $ python -c "print('Real Python')"
    Real Python
    
    71.
  • Dòng 7 khởi tạo thuật toán SHA1. instantiates a SHA1 algorithm.
  • Dòng 8 cập nhật đối tượng băm SHA1 với nội dung của đối số chương trình đầu tiên. Lưu ý rằng
    $ python -c "print('Real Python')"
    Real Python
    
    72 lấy một mảng byte làm đối số, do đó, cần phải chuyển đổi
    $ python -c "print('Real Python')"
    Real Python
    
    71 từ một chuỗi thành mảng byte.
    updates the SHA1 hash object with the content of the first program argument. Note that
    $ python -c "print('Real Python')"
    Real Python
    
    72 takes a byte array as an argument, so it’s necessary to convert
    $ python -c "print('Real Python')"
    Real Python
    
    71 from a string to a bytes array.
  • Dòng 9 in một biểu diễn thập lục phân của băm SHA1 được tính toán trên dòng 8. prints a hexadecimal representation of the SHA1 hash computed on line 8.

Khi bạn chạy tập lệnh bằng một đối số, bạn sẽ nhận được điều này:

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
4

Để giữ ngắn gọn ví dụ, tập lệnh

$ python -c "print('Real Python')"
Real Python
70 không xử lý các đối số dòng lệnh Python bị thiếu. Xử lý lỗi có thể được giải quyết trong tập lệnh này giống như cách bạn đã làm trong
$ python -c "print('Real Python')"
Real Python
60.

Từ tài liệu

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27, bạn tìm hiểu rằng để có được các byte gốc của các đối số dòng lệnh Python, bạn có thể sử dụng
$ python -c "print('Real Python')"
Real Python
77. Bằng cách trực tiếp lấy các byte từ
$ python -c "print('Real Python')"
Real Python
29, bạn không cần phải thực hiện chuyển đổi chuỗi thành bytes của
$ python -c "print('Real Python')"
Real Python
71:

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
5

Sự khác biệt chính giữa

$ python -c "print('Real Python')"
Real Python
70 và
$ python -c "print('Real Python')"
Real Python
81 được tô sáng trong các dòng sau:

  • Dòng 7 dân cư
    $ python -c "print('Real Python')"
    Real Python
    
    71 với các byte gốc được truyền cho các đối số dòng lệnh Python.
    populates
    $ python -c "print('Real Python')"
    Real Python
    
    71 with the original bytes passed to the Python command line arguments.
  • Dòng 9 vượt qua
    $ python -c "print('Real Python')"
    Real Python
    
    71 như một đối số cho
    $ python -c "print('Real Python')"
    Real Python
    
    84, nhận được một đối tượng giống như byte.
    passes
    $ python -c "print('Real Python')"
    Real Python
    
    71 as an argument to
    $ python -c "print('Real Python')"
    Real Python
    
    84, which receives a bytes-like object.

Thực thi

$ python -c "print('Real Python')"
Real Python
81 để so sánh đầu ra:

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
6

Giá trị thập lục phân của băm SHA1 giống như trong ví dụ

$ python -c "print('Real Python')"
Real Python
70 trước đó.

Giải phẫu của dòng lệnh Python

Bây giờ, bạn đã khám phá một vài khía cạnh của các đối số dòng lệnh Python, đáng chú ý nhất là

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27, bạn sẽ áp dụng một số tiêu chuẩn được các nhà phát triển sử dụng thường xuyên trong khi thực hiện giao diện dòng lệnh.

Đối số dòng lệnh Python là một tập hợp con của giao diện dòng lệnh. Chúng có thể bao gồm các loại đối số khác nhau:

  1. Tùy chọn sửa đổi hành vi của một lệnh hoặc chương trình cụ thể. modify the behavior of a particular command or program.
  2. Đối số đại diện cho nguồn hoặc đích sẽ được xử lý. represent the source or destination to be processed.
  3. Các tiểu ban cho phép một chương trình xác định nhiều hơn một lệnh với tập hợp các tùy chọn và đối số tương ứng. allow a program to define more than one command with the respective set of options and arguments.

Trước khi bạn đi sâu hơn vào các loại đối số khác nhau, bạn sẽ nhận được một cái nhìn tổng quan về các tiêu chuẩn được chấp nhận đã hướng dẫn thiết kế giao diện và đối số dòng lệnh. Chúng đã được tinh chỉnh kể từ sự ra đời của thiết bị đầu cuối máy tính vào giữa những năm 1960.

Tiêu chuẩn

Một số tiêu chuẩn có sẵn cung cấp một số định nghĩa và hướng dẫn để thúc đẩy tính nhất quán để thực hiện các lệnh và đối số của chúng. Đây là các tiêu chuẩn và tài liệu tham khảo chính của Unix:standards provide some definitions and guidelines to promote consistency for implementing commands and their arguments. These are the main UNIX standards and references:

  • Công ước Tiện ích Posix
  • Các tiêu chuẩn GNU cho các giao diện dòng lệnh
  • DOCOPT

Các tiêu chuẩn trên xác định các hướng dẫn và danh pháp cho bất cứ điều gì liên quan đến các chương trình và các đối số dòng lệnh Python. Các điểm sau đây là các ví dụ được lấy từ các tài liệu tham khảo đó:

  • POSIX::
    • Một chương trình hoặc tiện ích được theo sau bởi các tùy chọn, tùy chọn-argument và toán hạng.
    • Tất cả các tùy chọn nên được đi trước với ký tự dấu gạch nối hoặc trừ (
      >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo', action='append')
      >>> parser.parse_args('--foo 1 --foo 2'.split())
      Namespace(foo=['1', '2'])
      
      54).
    • Tùy chọn-âm không nên là tùy chọn.
  • GNU::
    • Tất cả các chương trình sẽ hỗ trợ hai tùy chọn tiêu chuẩn, đó là
      $ python -c "print('Real Python')"
      Real Python
      
      89 và
      $ python -c "print('Real Python')"
      Real Python
      
      90.
    • Các tùy chọn được đặt tên dài tương đương với các tùy chọn kiểu UNIX đơn lẻ. Một ví dụ là
      $ python -c "print('Real Python')"
      Real Python
      
      91 và
      $ python -c "print('Real Python')"
      Real Python
      
      92.
  • docopt::
    • Các tùy chọn ngắn có thể được xếp chồng lên nhau, có nghĩa là
      $ python -c "print('Real Python')"
      Real Python
      
      93 tương đương với
      $ python -c "print('Real Python')"
      Real Python
      
      94.
    • Tùy chọn dài có thể có các đối số được chỉ định sau một không gian hoặc dấu bằng (
      $ python -c "print('Real Python')"
      Real Python
      
      95). Tùy chọn dài
      $ python -c "print('Real Python')"
      Real Python
      
      96 tương đương với
      $ python -c "print('Real Python')"
      Real Python
      
      97.

Các tiêu chuẩn này xác định các ký hiệu hữu ích khi bạn mô tả một lệnh. Một ký hiệu tương tự có thể được sử dụng để hiển thị việc sử dụng một lệnh cụ thể khi bạn gọi nó với tùy chọn

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
04 hoặc
$ python -c "print('Real Python')"
Real Python
90.

Các tiêu chuẩn GNU rất giống với các tiêu chuẩn POSIX nhưng cung cấp một số sửa đổi và tiện ích mở rộng. Đáng chú ý, họ thêm tùy chọn dài mà một tùy chọn được đặt tên đầy đủ có tiền tố với hai dấu gạch nối (

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
00). Ví dụ: để hiển thị trợ giúp, tùy chọn thông thường là
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
04 và tùy chọn dài là
$ python -c "print('Real Python')"
Real Python
90.long option that’s a fully named option prefixed with two hyphens (
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
00). For example, to display the help, the regular option is
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
04 and the long option is
$ python -c "print('Real Python')"
Real Python
90.

Trong các phần sau, bạn sẽ tìm hiểu thêm về từng thành phần dòng lệnh, tùy chọn, đối số và lệnh phụ.

Tùy chọn

Một tùy chọn, đôi khi được gọi là cờ hoặc công tắc, nhằm sửa đổi hành vi của chương trình. Ví dụ: lệnh

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
03 trên Linux liệt kê nội dung của một thư mục nhất định. Không có bất kỳ đối số nào, nó liệt kê các tệp và thư mục trong thư mục hiện tại:option, sometimes called a flag or a switch, is intended to modify the behavior of the program. For example, the command
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
03 on Linux lists the content of a given directory. Without any arguments, it lists the files and directories in the current directory:

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
7

Hãy để thêm một vài tùy chọn. Bạn có thể kết hợp

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
04 và
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
05 thành
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
06, thay đổi thông tin được hiển thị trong thiết bị đầu cuối:

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
8

Một tùy chọn có thể lấy một đối số, được gọi là một đối tượng tùy chọn. Xem một ví dụ trong hành động với

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
07 bên dưới:option can take an argument, which is called an option-argument. See an example in action with
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
07 below:

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
9

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
07 là viết tắt của bãi rác. Tiện ích này hiển thị dữ liệu trong các biểu diễn có thể in khác nhau, như Octal (là mặc định), thập lục phân, thập phân và ASCII. Trong ví dụ trên, nó lấy tệp nhị phân
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
17 và hiển thị 16 byte đầu tiên của tệp ở định dạng thập lục phân. Tùy chọn
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
10 mong đợi một loại là một đối số tùy chọn và
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
11 mong đợi số lượng byte đầu vào.
stands for octal dump. This utility displays data in different printable representations, like octal (which is the default), hexadecimal, decimal, and ASCII. In the example above, it takes the binary file
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
17 and displays the first 16 bytes of the file in hexadecimal format. The option
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
10 expects a type as an option-argument, and
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
11 expects the number of input bytes.

Trong ví dụ trên,

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
10 được đưa ra loại
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
13, viết tắt của thập lục phân và một byte mỗi số nguyên. Điều này được theo sau bởi
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
14 để hiển thị các ký tự có thể in ở cuối dòng đầu vào.
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
11 lấy
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
16 như một đối tượng tùy chọn để giới hạn số lượng byte đầu vào đến 16.

Tranh luận

Các đối số cũng được gọi là toán hạng hoặc tham số trong các tiêu chuẩn POSIX. Các đối số đại diện cho nguồn hoặc đích của dữ liệu mà lệnh hoạt động. Ví dụ: lệnh

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
17, được sử dụng để sao chép một hoặc nhiều tệp vào tệp hoặc thư mục, lấy ít nhất một nguồn và một mục tiêu:arguments are also called operands or parameters in the POSIX standards. The arguments represent the source or the destination of the data that the command acts on. For example, the command
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
17, which is used to copy one or more files to a file or a directory, takes at least one source and one target:

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
0

Trong dòng 4,

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
17 có hai đối số:

  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    17: Tệp nguồn
    the source file
  2. $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    20: Tệp đích
    the target file

Sau đó, nó sao chép nội dung của

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
17 vào một tệp mới có tên
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
20. Cả
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
17 và
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
20 đều là đối số hoặc toán hạng của chương trình
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
17.

Tiểu ban

Khái niệm về các tiểu ban được ghi lại trong các tiêu chuẩn POSIX hoặc GNU, nhưng nó xuất hiện trong Docopt. Các tiện ích UNIX tiêu chuẩn là các công cụ nhỏ tuân thủ triết lý Unix. Các chương trình UNIX được dự định là các chương trình làm một việc và làm tốt. Điều này có nghĩa là không có tiểu ban là cần thiết.subcommands isn’t documented in the POSIX or GNU standards, but it does appear in docopt. The standard Unix utilities are small tools adhering to the Unix philosophy. Unix programs are intended to be programs that do one thing and do it well. This means no subcommands are necessary.

Ngược lại, một thế hệ chương trình mới, bao gồm

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
26,
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
27,
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
28 và
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
29, đi kèm với một mô hình hơi khác bao gồm các tiểu ban. Họ không nhất thiết phải là một phần của cảnh quan Unix khi họ trải rộng một số hệ điều hành và họ đã triển khai với một hệ sinh thái đầy đủ đòi hỏi một số lệnh.

Lấy

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
26 làm ví dụ. Nó xử lý một số lệnh, mỗi lệnh có thể với bộ tùy chọn, phân tích tùy chọn và đối số riêng của chúng. Các ví dụ sau đây áp dụng cho tiểu ban Git
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
31:

  • $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    32 hiển thị các nhánh của kho lưu trữ git cục bộ.
    displays the branches of the local git repository.
  • $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    33 tạo ra một chi nhánh địa phương
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    34 trong kho lưu trữ địa phương.
    creates a local branch
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    34 in a local repository.
  • $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    35 Xóa chi nhánh địa phương
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    34.
    deletes the local branch
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    34.
  • $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    37 Hiển thị trợ giúp cho tiểu ban
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    32.
    displays the help for the
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    32 subcommand.

Trong hệ sinh thái Python,

$ python -c "print('Real Python')"
Real Python
10 cũng có khái niệm về các tiểu ban. Một số tiểu ban
$ python -c "print('Real Python')"
Real Python
10 bao gồm
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
41,
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
42,
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
43 hoặc
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
44.

các cửa sổ

Trên Windows, các quy ước liên quan đến các đối số dòng lệnh Python hơi khác nhau, đặc biệt, các quy ước liên quan đến các tùy chọn dòng lệnh. Để xác thực sự khác biệt này, hãy lấy

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
45, đây là một Windows có thể thực thi có thể hiển thị danh sách các quy trình hiện đang chạy. Nó tương tự như
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
46 trên các hệ thống Linux hoặc MacOS. Dưới đây là một ví dụ về cách thực thi
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
45 trong dấu nhắc lệnh trên Windows:

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
1

Lưu ý rằng bộ tách cho một tùy chọn là một dấu gạch chéo phía trước (

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
48) thay vì dấu gạch nối (
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
54) như các quy ước cho các hệ thống UNIX. Đối với khả năng đọc, có một khoảng trống giữa tên chương trình,
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
50 và tùy chọn
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
51, nhưng nó cũng đúng như loại
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
52.

Ví dụ cụ thể ở trên thực thi

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
45 với bộ lọc chỉ hiển thị các quy trình Notepad hiện đang chạy. Bạn có thể thấy rằng hệ thống có hai phiên bản chạy của quy trình Notepad. Mặc dù nó không tương đương, nhưng điều này tương tự như thực hiện lệnh sau trong một thiết bị đầu cuối trên hệ thống giống như UNIX:

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
2

Lệnh

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
46 ở trên cho thấy tất cả các quy trình
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
55 đang chạy hiện tại. Hành vi phù hợp với triết lý Unix, vì đầu ra của
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
46 được chuyển đổi bởi hai bộ lọc
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
57. Lệnh
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
57 đầu tiên chọn tất cả các lần xuất hiện của
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
55 và
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
57 thứ hai lọc ra sự xuất hiện của chính
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
57.

Với sự lây lan của các công cụ UNIX xuất hiện trong hệ sinh thái Windows, các quy ước không dành riêng cho Windows cũng được chấp nhận trên Windows.

Hình ảnh

Khi bắt đầu một quá trình Python, các đối số dòng lệnh Python được chia thành hai loại:

  1. Tùy chọn Python: Những ảnh hưởng này ảnh hưởng đến việc thực hiện trình thông dịch Python. Ví dụ: thêm tùy chọn

    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    62 là một phương tiện để tối ưu hóa việc thực hiện chương trình Python bằng cách xóa các câu lệnh
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    63 và
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    64. Có các tùy chọn Python khác có sẵn ở dòng lệnh.
    These influence the execution of the Python interpreter. For example, adding option
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    62 is a means to optimize the execution of a Python program by removing
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    63 and
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    64 statements. There are other Python options available at the command line.

  2. Chương trình Python và các đối số của nó: Theo các tùy chọn Python (nếu có), bạn sẽ tìm thấy chương trình Python, đây là tên tệp thường có phần mở rộng ____365 và các đối số của nó. Theo quy ước, chúng cũng có thể bao gồm các tùy chọn và đối số. Following the Python options (if there are any), you’ll find the Python program, which is a file name that usually has the extension

    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    65, and its arguments. By convention, those can also be composed of options and arguments.

Lấy lệnh sau đây mà dự định thực hiện chương trình

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
24, có các tùy chọn và đối số. Lưu ý rằng, trong ví dụ này, trình thông dịch Python cũng có một số tùy chọn, đó là
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
67 và
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
68.

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
3

Trong dòng lệnh ở trên, các tùy chọn là các đối số dòng lệnh Python và được tổ chức như sau:

  • Tùy chọn
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    67 cho Python không ghi các tệp
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    70 trên việc nhập các mô -đun nguồn. Để biết thêm chi tiết về các tệp
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    70, hãy xem phần Trình biên dịch làm gì? Trong hướng dẫn của bạn về mã nguồn cpython.
    tells Python not to write
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    70 files on the import of source modules. For more details about
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    70 files, check out the section What Does a Compiler Do? in Your Guide to the CPython Source Code.
  • Tùy chọn
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    68 là viết tắt của Verbose và bảo Python theo dõi tất cả các báo cáo nhập.
    stands for verbose and tells Python to trace all import statements.
  • Các đối số được chuyển cho
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    24 là hư cấu và đại diện cho hai tùy chọn dài (
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    74 và
    $ python -c "print('Real Python')"
    Real Python
    
    91) và hai đối số (
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    76 và
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    77).
    are fictitious and represent two long options (
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    74 and
    $ python -c "print('Real Python')"
    Real Python
    
    91) and two arguments (
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    76 and
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    77).

Ví dụ này về các đối số dòng lệnh Python có thể được minh họa bằng đồ họa như sau:

Hướng dẫn can we pass list as command line argument in python? - chúng ta có thể chuyển danh sách dưới dạng đối số dòng lệnh trong python không?

Trong chương trình Python

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
24, bạn chỉ có quyền truy cập vào các đối số dòng lệnh Python được chèn bởi Python trong
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27. Các tùy chọn Python có thể ảnh hưởng đến hành vi của chương trình nhưng không thể truy cập được trong
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
24.

Một vài phương pháp để phân tích các đối số dòng lệnh Python

Bây giờ, bạn sẽ khám phá một vài cách tiếp cận để bắt giữ các tùy chọn, phân tích tùy chọn và toán hạng. Điều này được thực hiện bằng cách phân tích các đối số dòng lệnh Python. Trong phần này, bạn sẽ thấy một số khía cạnh cụ thể của các đối số và kỹ thuật dòng lệnh Python để xử lý chúng. Đầu tiên, bạn sẽ thấy một ví dụ giới thiệu một cách tiếp cận thẳng dựa vào sự hiểu biết danh sách để thu thập và riêng biệt các tùy chọn với các đối số. Sau đó bạn sẽ:parsing Python command line arguments. In this section, you’ll see some concrete aspects of Python command line arguments and techniques to handle them. First, you’ll see an example that introduces a straight approach relying on list comprehensions to collect and separate options from arguments. Then you will:

  • Sử dụng các biểu thức chính quy để trích xuất các phần tử của dòng lệnh regular expressions to extract elements of the command line
  • Tìm hiểu cách xử lý các tệp được truyền ở dòng lệnh how to handle files passed at the command line
  • Nắm bắt đầu vào tiêu chuẩn theo cách tương thích với các công cụ UNIX the standard input in a way that’s compatible with the Unix tools
  • Phân biệt đầu ra thông thường của chương trình với các lỗi the regular output of the program from the errors
  • Thực hiện trình phân tích cú pháp tùy chỉnh để đọc các đối số dòng lệnh Python a custom parser to read Python command line arguments

Điều này sẽ phục vụ như một sự chuẩn bị cho các tùy chọn liên quan đến các mô -đun trong các thư viện tiêu chuẩn hoặc từ các thư viện bên ngoài mà bạn sẽ tìm hiểu về sau trong hướng dẫn này.

Đối với một cái gì đó không phức tạp, mẫu sau, không thực thi đặt hàng và không xử lý các loại tùy chọn, có thể là đủ:

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
4

Mục đích của chương trình trên là sửa đổi trường hợp của các đối số dòng lệnh Python. Ba tùy chọn có sẵn:

  • >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    02 để tận dụng các lập luận
    to capitalize the arguments
  • $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    82 để chuyển đổi các đối số thành chữ hoa
    to convert the arguments to uppercase
  • $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    04 để chuyển đổi đối số thành chữ thường
    to convert the argument to lowercase

Mã thu thập và phân tách các loại đối số khác nhau bằng cách sử dụng toàn bộ danh sách:

  • Dòng 5 thu thập tất cả các tùy chọn bằng cách lọc trên bất kỳ đối số dòng lệnh Python nào bắt đầu bằng dấu gạch nối (
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    54).
    collects all the options by filtering on any Python command line arguments starting with a hyphen (
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    54).
  • Dòng 6 tập hợp các đối số chương trình bằng cách lọc ra các tùy chọn. assembles the program arguments by filtering out the options.

Khi bạn thực hiện chương trình Python ở trên với một tập hợp các tùy chọn và đối số, bạn sẽ nhận được đầu ra sau:

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
5

Cách tiếp cận này có thể đủ trong nhiều tình huống, nhưng nó sẽ thất bại trong các trường hợp sau:

  • Nếu thứ tự là quan trọng và đặc biệt, nếu các tùy chọn sẽ xuất hiện trước các đối số
  • Nếu cần hỗ trợ cho các đối tượng tùy chọn
  • Nếu một số đối số được có tiền tố với dấu gạch nối (
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    54)

Bạn có thể tận dụng các tùy chọn khác trước khi bạn sử dụng thư viện như

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
9 hoặc
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
87.

Biểu cảm thường xuyên

Bạn có thể sử dụng một biểu thức thông thường để thực thi một thứ tự nhất định, các tùy chọn cụ thể và các tùy chọn-argument hoặc thậm chí loại đối số. Để minh họa việc sử dụng biểu thức chính quy để phân tích các đối số dòng lệnh Python, bạn sẽ thực hiện phiên bản Python của

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55, đây là một chương trình in một chuỗi số. Theo các quy ước của DOCOPT, một đặc điểm kỹ thuật cho
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
89 có thể là:

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
6

Đầu tiên, hãy nhìn vào một biểu thức thông thường mà Lừa dự định nắm bắt các yêu cầu ở trên:

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
7

Để thử nghiệm biểu thức thông thường ở trên, bạn có thể sử dụng đoạn trích được ghi trên biểu thức thông thường 101. Biểu thức chính quy nắm bắt và thực thi một vài khía cạnh của các yêu cầu được đưa ra cho

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55. Cụ thể, lệnh có thể lấy:

  1. Tùy chọn trợ giúp, nói tóm lại (
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    04) hoặc định dạng dài (
    $ python -c "print('Real Python')"
    Real Python
    
    90), được chụp dưới dạng một nhóm có tên gọi là
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    93
    , in short (
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    04) or long format (
    $ python -c "print('Real Python')"
    Real Python
    
    90), captured as a named group called
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    93
  2. Tùy chọn phân tách,
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    05 hoặc
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    95, lấy một đối số tùy chọn và bị bắt theo nhóm được đặt tên là
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    96
    ,
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    05 or
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    95, taking an optional argument, and captured as named group called
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    96
  3. Lên đến ba toán hạng số nguyên, tương ứng được chụp là
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    97,
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    98 và
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    99
    , respectively captured as
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    97
    ,
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    98
    , and
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    99

Để rõ ràng, mẫu

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
00 ở trên sử dụng cờ
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
01 trên dòng 11. Điều này cho phép bạn truyền biểu thức chính quy qua một vài dòng để tăng cường khả năng đọc. Mẫu xác thực như sau:

  • Lệnh đối số: Tùy chọn và đối số dự kiến ​​sẽ được quy định theo một thứ tự nhất định. Ví dụ, các tùy chọn được mong đợi trước các đối số.: Options and arguments are expected to be laid out in a given order. For example, options are expected before the arguments.
  • Giá trị tùy chọn **: Chỉ
    $ python -c "print('Real Python')"
    Real Python
    
    90,
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    05 hoặc
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    95 được mong đợi dưới dạng tùy chọn.
    **: Only
    $ python -c "print('Real Python')"
    Real Python
    
    90,
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    05, or
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    95 are expected as options.
  • Đối số độc quyền lẫn nhau: Tùy chọn
    $ python -c "print('Real Python')"
    Real Python
    
    90 không tương thích với các tùy chọn hoặc đối số khác.
    : The option
    $ python -c "print('Real Python')"
    Real Python
    
    90 isn’t compatible with other options or arguments.
  • Loại đối số: Các toán hạng dự kiến ​​sẽ là số nguyên dương hoặc âm.: Operands are expected to be positive or negative integers.

Để biểu thức thông thường có thể xử lý những thứ này, nó cần phải xem tất cả các đối số dòng lệnh Python trong một chuỗi. Bạn có thể thu thập chúng bằng cách sử dụng str.join ():

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
8

Điều này làm cho

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
06 một chuỗi bao gồm tất cả các đối số, ngoại trừ tên chương trình, được phân tách bằng một không gian.

Với mẫu

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
00 ở trên, bạn có thể trích xuất các đối số dòng lệnh Python với chức năng sau:

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
9

Mẫu đã xử lý thứ tự của các đối số, tính độc quyền lẫn nhau giữa các tùy chọn và đối số và loại đối số.

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
08 đang áp dụng
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
09 cho dòng đối số để trích xuất các giá trị phù hợp và lưu trữ dữ liệu trong từ điển.

Từ điển bao gồm tên của mỗi nhóm là khóa và giá trị tương ứng của chúng. Ví dụ: nếu giá trị

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
06 là
$ python -c "print('Real Python')"
Real Python
90, thì từ điển là
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
12. Nếu
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
06 là
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
14, thì từ điển sẽ trở thành
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
15. Bạn có thể mở rộng khối mã bên dưới để xem việc triển khai
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55 với các biểu thức thông thường.

Mã bên dưới thực hiện phiên bản giới hạn của

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55 với biểu thức thông thường để xử lý phân tích và xác thực dòng lệnh:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55
with a regular expression to handle the command line parsing and validation:

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
0

Bạn có thể thực thi mã ở trên bằng cách chạy lệnh này:

Điều này sẽ xuất hiện như sau:

Hãy thử lệnh này với các kết hợp khác, bao gồm tùy chọn

$ python -c "print('Real Python')"
Real Python
90.

Bạn đã không thấy một tùy chọn phiên bản được cung cấp ở đây. Điều này đã được thực hiện có chủ ý để giảm độ dài của ví dụ. Bạn có thể xem xét thêm tùy chọn phiên bản như một bài tập mở rộng. Như một gợi ý, bạn có thể sửa đổi biểu thức thông thường bằng cách thay thế dòng

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
19 bằng
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
20. Một khối
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
21 bổ sung cũng sẽ cần thiết trong
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
08.

Tại thời điểm này, bạn biết một vài cách để trích xuất các tùy chọn và đối số từ dòng lệnh. Cho đến nay, các đối số dòng lệnh Python chỉ là chuỗi hoặc số nguyên. Tiếp theo, bạn sẽ học cách xử lý các tệp được truyền dưới dạng đối số.

Xử lý tập tin

Bây giờ, thời gian để thử nghiệm với các đối số dòng lệnh Python dự kiến ​​sẽ là tên tệp. Sửa đổi

$ python -c "print('Real Python')"
Real Python
70 để xử lý một hoặc nhiều tệp làm đối số. Bạn sẽ kết thúc với một phiên bản bị hạ cấp của tiện ích
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41 gốc, lấy một hoặc nhiều tệp làm đối số và hiển thị băm Sha1 thập lục phân cho mỗi tệp, theo sau là tên của tệp:file names. Modify
$ python -c "print('Real Python')"
Real Python
70 to handle one or more files as arguments. You’ll end up with a downgraded version of the original
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41 utility, which takes one or more files as arguments and displays the hexadecimal SHA1 hash for each file, followed by the name of the file:

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
1

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
25 được áp dụng cho dữ liệu được đọc từ mỗi tệp mà bạn đã truyền ở dòng lệnh, thay vì chính chuỗi. Hãy lưu ý rằng
$ python -c "print('Real Python')"
Real Python
84 lấy một đối tượng giống như byte làm đối số và kết quả của việc gọi
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
27 sau khi mở một tệp có chế độ
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
28 sẽ trả về một đối tượng
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
29. Để biết thêm thông tin về việc xử lý nội dung tệp, hãy xem đọc và ghi tệp bằng Python và đặc biệt, phần làm việc với byte.

Sự phát triển của

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
30 từ việc xử lý các chuỗi ở dòng lệnh để thao tác nội dung của các tệp đang giúp bạn tiến gần hơn đến việc triển khai ban đầu của
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41:

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
2

Việc thực hiện chương trình Python với cùng các đối số dòng lệnh Python đưa ra điều này:

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
3

Bởi vì bạn tương tác với trình thông dịch shell hoặc dấu nhắc lệnh windows, bạn cũng nhận được lợi ích của việc mở rộng thẻ đại diện do vỏ. Để chứng minh điều này, bạn có thể sử dụng lại

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
24, hiển thị từng đối số với số đối số và giá trị của nó:

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
4

Bạn có thể thấy rằng shell tự động thực hiện mở rộng ký tự đại diện để bất kỳ tệp nào có tên cơ sở khớp với

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
17, bất kể phần mở rộng, là một phần của
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27.

Việc mở rộng ký tự đại diện có sẵn trên Windows. Để có được hành vi tương tự, bạn cần thực hiện nó trong mã của mình. Để tái cấu trúc

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
24 để làm việc với việc mở rộng ký tự đại diện, bạn có thể sử dụng
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
36. Ví dụ sau đây hoạt động trên Windows và mặc dù nó không ngắn gọn như
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
24 ban đầu, cùng một mã hoạt động tương tự nhau trên các nền tảng:

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
5

Trong

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
38,
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
39 dựa vào
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
40 để xử lý các ký tự đại diện kiểu vỏ. Bạn có thể xác minh kết quả trên Windows và bất kỳ hệ điều hành nào khác:

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
6

Điều này giải quyết vấn đề xử lý các tệp bằng các ký tự đại diện như dấu hoa thị (

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
43) hoặc dấu câu hỏi (
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
42), nhưng làm thế nào về
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
43?

Nếu bạn không chuyển bất kỳ tham số nào cho tiện ích

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41 ban đầu, thì nó dự kiến ​​sẽ đọc dữ liệu từ đầu vào tiêu chuẩn. Đây là văn bản bạn nhập tại thiết bị đầu cuối kết thúc khi bạn nhập Ctrl+D trên các hệ thống giống như Unix hoặc Ctrl+Z trên Windows. Các chuỗi điều khiển này gửi một kết thúc của tệp (EOF) đến thiết bị đầu cuối, dừng đọc từ
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
43 và trả về dữ liệu đã được nhập.standard input. This is the text you enter at the terminal that ends when you type Ctrl+D on Unix-like systems or Ctrl+Z on Windows. These control sequences send an end of file (EOF) to the terminal, which stops reading from
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
43 and returns the data that was entered.

Trong phần tiếp theo, bạn sẽ thêm vào mã của mình khả năng đọc từ luồng đầu vào tiêu chuẩn.

Đầu vào tiêu chuẩn

Khi bạn sửa đổi triển khai Python trước đó của

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41 để xử lý đầu vào tiêu chuẩn bằng cách sử dụng
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
47, bạn sẽ đến gần hơn với
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41 gốc:

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
7

Hai quy ước được áp dụng cho phiên bản

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41 mới này:

  1. Không có bất kỳ đối số nào, chương trình hy vọng dữ liệu sẽ được cung cấp trong đầu vào tiêu chuẩn,
     1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    47, đây là một đối tượng tệp có thể đọc được.
  2. Khi một dấu gạch nối (
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    54) được cung cấp dưới dạng đối số tệp ở dòng lệnh, chương trình diễn giải nó khi đọc tệp từ đầu vào tiêu chuẩn.

Hãy thử tập lệnh mới này mà không có bất kỳ đối số nào. Nhập Aphorism đầu tiên của Zen of Python, sau đó hoàn thành mục nhập với phím tắt Ctrl+D trên các hệ thống giống như UNIX hoặc Ctrl+Z trên Windows:Ctrl+D on Unix-like systems or Ctrl+Z on Windows:

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
8

Bạn cũng có thể bao gồm một trong các đối số dưới dạng

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
43 được trộn với các đối số tệp khác như vậy:

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
9

Một cách tiếp cận khác trên các hệ thống giống UNIX là cung cấp

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
53 thay vì
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
54 để xử lý đầu vào tiêu chuẩn:

$ ./main Python Command Line Arguments
Arguments count: 5
Argument      0: ./main
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
0

Trên Windows, không có tương đương với

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
53, do đó, sử dụng
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
54 làm đối số tệp hoạt động như mong đợi.

Kịch bản

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
57 không bao gồm tất cả các xử lý lỗi cần thiết, nhưng bạn sẽ bao gồm một số tính năng còn thiếu sau này trong hướng dẫn này.

Đầu ra tiêu chuẩn và lỗi tiêu chuẩn

Xử lý dòng lệnh có thể có mối quan hệ trực tiếp với

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
43 để tôn trọng các quy ước được chi tiết trong phần trước. Sản lượng tiêu chuẩn, mặc dù không liên quan ngay lập tức, vẫn là một mối quan tâm nếu bạn muốn tuân thủ triết lý Unix. Để cho phép các chương trình nhỏ được kết hợp, bạn có thể phải tính đến ba luồng tiêu chuẩn:

  1.  1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    43
  2.  1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    60
  3.  1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    61

Đầu ra của một chương trình trở thành đầu vào của một chương trình khác, cho phép bạn chuỗi các tiện ích nhỏ. Ví dụ: nếu bạn muốn sắp xếp các câu cách ngôn của Zen of Python, thì bạn có thể thực hiện những điều sau đây:

$ ./main Python Command Line Arguments
Arguments count: 5
Argument      0: ./main
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
1

Đầu ra trên được cắt ngắn để đọc tốt hơn. Bây giờ hãy tưởng tượng rằng bạn có một chương trình xuất ra cùng một dữ liệu nhưng cũng in một số thông tin gỡ lỗi:

$ ./main Python Command Line Arguments
Arguments count: 5
Argument      0: ./main
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
2

Thực hiện tập lệnh Python ở trên đưa ra:

$ ./main Python Command Line Arguments
Arguments count: 5
Argument      0: ./main
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
3

Ellipsis (

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
62) chỉ ra rằng đầu ra đã bị cắt ngắn để cải thiện khả năng đọc.

Bây giờ, nếu bạn muốn sắp xếp danh sách các câu cách ngôn, thì hãy thực thi lệnh như sau:

$ ./main Python Command Line Arguments
Arguments count: 5
Argument      0: ./main
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
4

Bạn có thể nhận ra rằng bạn đã không có ý định có đầu ra gỡ lỗi làm đầu vào của lệnh

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
63. Để giải quyết vấn đề này, bạn muốn gửi dấu vết đến luồng lỗi tiêu chuẩn, thay vào đó là
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
61:

$ ./main Python Command Line Arguments
Arguments count: 5
Argument      0: ./main
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
5

Thực hiện

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
65 để quan sát những điều sau:

$ ./main Python Command Line Arguments
Arguments count: 5
Argument      0: ./main
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
6

Bây giờ, các dấu vết được hiển thị cho thiết bị đầu cuối, nhưng chúng không được sử dụng làm đầu vào cho lệnh

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
63.

Phân tích cú pháp tùy chỉnh

Bạn có thể thực hiện

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55 bằng cách dựa vào biểu thức chính quy nếu các đối số không quá phức tạp. Tuy nhiên, mẫu Regex có thể nhanh chóng khiến việc duy trì tập lệnh trở nên khó khăn. Trước khi bạn thử nhận trợ giúp từ các thư viện cụ thể, một cách tiếp cận khác là tạo trình phân tích cú pháp tùy chỉnh. Trình phân tích cú pháp là một vòng lặp lấy từng đối số từng đối số và áp dụng logic tùy chỉnh dựa trên ngữ nghĩa của chương trình của bạn.custom parser. The parser is a loop that fetches each argument one after another and applies a custom logic based on the semantics of your program.

Một triển khai có thể để xử lý các đối số của

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
68 có thể như sau:

$ ./main Python Command Line Arguments
Arguments count: 5
Argument      0: ./main
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
7

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
08 được đưa ra danh sách các đối số mà không có tên tệp Python và sử dụng
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
70 để nhận được lợi ích của
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
71, loại bỏ các yếu tố từ bên trái của bộ sưu tập. Khi các mục của danh sách các đối số mở ra, bạn áp dụng logic mà bạn mong đợi cho chương trình của bạn. Trong
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
08, bạn có thể quan sát như sau:

  • Vòng lặp
     1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    73 là cốt lõi của hàm và chấm dứt khi không có nhiều đối số hơn để phân tích, khi sự trợ giúp được gọi hoặc khi xảy ra lỗi.
     1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    73 loop
    is at the core of the function, and terminates when there are no more arguments to parse, when the help is invoked, or when an error occurs.
  • Nếu tùy chọn
     1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    74 được phát hiện, thì đối số tiếp theo dự kiến ​​là dấu phân cách.
     1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    74
    option is detected, then the next argument is expected to be the separator.
  •  1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    75 lưu trữ các số nguyên được sử dụng để tính toán trình tự. Cần có ít nhất một toán hạng và nhiều nhất là ba.
    stores the integers that are used to calculate the sequence. There should be at least one operand and at most three.

Một phiên bản đầy đủ của mã cho

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
08 có sẵn bên dưới:

$ ./main Python Command Line Arguments
Arguments count: 5
Argument      0: ./main
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
8

Lưu ý rằng một số khía cạnh xử lý lỗi được giữ ở mức tối thiểu để giữ các ví dụ tương đối ngắn.

Cách tiếp cận thủ công này để phân tích các đối số dòng lệnh Python có thể là đủ cho một tập hợp các đối số đơn giản. Tuy nhiên, nó trở nên nhanh chóng dễ bị lỗi khi độ phức tạp tăng lên do như sau:

  • Một số lượng lớn các đối số of arguments
  • Sự phức tạp và sự phụ thuộc lẫn nhau giữa các đối số between arguments
  • Xác nhận để thực hiện chống lại các đối số to perform against the arguments

Cách tiếp cận tùy chỉnh là có thể tái sử dụng và yêu cầu phát minh lại bánh xe trong mỗi chương trình. Đến cuối hướng dẫn này, bạn sẽ cải thiện giải pháp thủ công này và học được một vài phương pháp tốt hơn.

Một vài phương pháp để xác thực các đối số dòng lệnh Python

Bạn đã thực hiện xác thực cho các đối số dòng lệnh Python trong một vài ví dụ như

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
77 và
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
68. Trong ví dụ đầu tiên, bạn đã sử dụng một biểu thức thông thường và trong ví dụ thứ hai, một trình phân tích cú pháp tùy chỉnh.

Cả hai ví dụ này đều tính đến các khía cạnh tương tự. Họ coi các tùy chọn dự kiến ​​là dạng ngắn (

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
05) hoặc dạng dài (
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
95). Họ đã xem xét thứ tự của các đối số để các tùy chọn sẽ không được đặt sau các toán hạng. Cuối cùng, họ đã xem xét loại, số nguyên cho các toán hạng và số lượng đối số, từ một đến ba đối số.options as short-form (
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
05) or long-form (
$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
95). They considered the order of the arguments so that options would not be placed after operands. Finally, they considered the type, integer for the operands, and the number of arguments, from one to three arguments.

Nhập xác thực với các lớp dữ liệu Python

Sau đây là một bằng chứng về khái niệm cố gắng xác nhận loại đối số được truyền ở dòng lệnh. Trong ví dụ sau, bạn xác nhận số lượng đối số và loại tương ứng của chúng:

$ ./main Python Command Line Arguments
Arguments count: 5
Argument      0: ./main
Argument      1: Python
Argument      2: Command
Argument      3: Line
Argument      4: Arguments
9

Trừ khi bạn vượt qua tùy chọn

$ python -c "print('Real Python')"
Real Python
90 tại dòng lệnh, tập lệnh này mong đợi hai hoặc ba đối số:

  1. Một chuỗi bắt buộc:
     1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    82
     1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    82
  2. Một chuỗi bắt buộc:
     1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    83
     1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    83
  3. Một số nguyên tùy chọn:
     1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    84
     1// main.c
     2#include 
     3
     4int main(int argc, char *argv[]) {
     5    printf("Arguments count: %d\n", argc);
     6    for (int i = 0; i < argc; i++) {
     7        printf("Argument %6d: %s\n", i, argv[i]);
     8    }
     9    return 0;
    10}
    
    84

Bởi vì tất cả các mục trong

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
27 là các chuỗi, bạn cần chuyển đổi đối số thứ ba tùy chọn thành một số nguyên nếu nó bao gồm các chữ số.
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
86 xác nhận nếu tất cả các ký tự trong một chuỗi là các chữ số. Ngoài ra, bằng cách xây dựng lớp dữ liệu
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
40 với các giá trị của các đối số được chuyển đổi, bạn có được hai xác nhận:data class
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
40 with the values of the converted arguments, you obtain two validations:

  1. Nếu số lượng đối số không tương ứng với số lượng các trường bắt buộc được dự kiến ​​bởi
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    40, thì bạn sẽ gặp lỗi. Đây là tối thiểu hai và tối đa ba trường.
    doesn’t correspond to the number of mandatory fields expected by
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    40, then you get an error. This is a minimum of two and a maximum of three fields.
  2. Nếu các loại sau khi chuyển đổi aren phù hợp với các loại được xác định trong định nghĩa lớp dữ liệu
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    40, thì bạn sẽ gặp lỗi.
    aren’t matching the types defined in the
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    40 data class definition, then you get an error.

Bạn có thể thấy điều này trong hành động với việc thực thi sau:

C:/>main
Arguments count: 1
Argument      0: main
0

Trong thực thi ở trên, số lượng đối số là chính xác và loại của mỗi đối số cũng là chính xác.

Bây giờ, thực thi cùng một lệnh nhưng bỏ qua đối số thứ ba:

C:/>main
Arguments count: 1
Argument      0: main
1

Kết quả cũng thành công vì trường

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
84 được xác định với giá trị mặc định,
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
91, do đó lớp dữ liệu
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
40 không yêu cầu.default value,
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
91, so the data class
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
40 doesn’t require it.

Ngược lại, nếu đối số thứ ba không phải là loại đúng kiểu, một chuỗi thay vì số nguyên thì bạn sẽ gặp lỗi:

C:/>main
Arguments count: 1
Argument      0: main
2

Giá trị dự kiến ​​

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
93, được bao quanh bởi các trích dẫn, do đó, nó chia tách. Từ thứ hai của họ,
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
94, là một chuỗi mà xử lý theo tuổi, dự kiến ​​sẽ là một
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
95. Việc xác nhận thất bại.

Tương tự, bạn cũng có thể sử dụng

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
96 để đạt được xác nhận tương tự. Bạn có thể thay thế lớp dữ liệu bằng một lớp xuất phát từ
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
96 và
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
98 sẽ thay đổi như sau:

C:/>main
Arguments count: 1
Argument      0: main
3

A

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
96 hiển thị các chức năng như
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
00 chuyển đổi đối tượng thành một từ điển có thể được sử dụng để tra cứu dữ liệu. Nó cũng phơi bày các thuộc tính như
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
01, đây là loại lưu trữ từ điển cho mỗi trường và để biết thêm về
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
01, hãy xem kiểm tra loại Python (Hướng dẫn).

Như được nhấn mạnh trong kiểm tra loại Python (Hướng dẫn), bạn cũng có thể tận dụng các gói hiện có như Enforce, Pydantic và PyTypes để xác nhận nâng cao.

Xác nhận tùy chỉnh

Không giống như những gì bạn đã khám phá trước đó, xác thực chi tiết có thể yêu cầu một số phương pháp tùy chỉnh. Ví dụ: nếu bạn cố gắng thực thi

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
57 với tên tệp không chính xác làm đối số, thì bạn sẽ nhận được như sau:

C:/>main
Arguments count: 1
Argument      0: main
4

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
04 không tồn tại, nhưng chương trình cố gắng đọc nó.

Xem lại

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
08 trong
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
57 để xử lý các tệp không tồn tại được truyền ở dòng lệnh:

C:/>main
Arguments count: 1
Argument      0: main
5

Để xem ví dụ hoàn chỉnh với xác thực bổ sung này, hãy mở rộng khối mã bên dưới:

C:/>main
Arguments count: 1
Argument      0: main
6

Khi bạn thực hiện tập lệnh đã sửa đổi này, bạn sẽ nhận được điều này:

C:/>main
Arguments count: 1
Argument      0: main
7

Lưu ý rằng lỗi được hiển thị cho thiết bị đầu cuối được ghi vào

 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
61, do đó, nó không can thiệp vào dữ liệu được mong đợi bởi một lệnh sẽ đọc đầu ra của
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
08:

C:/>main
Arguments count: 1
Argument      0: main
8

Lệnh này cung cấp đầu ra của

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
08 đến
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
10 chỉ bao gồm trường đầu tiên. Bạn có thể thấy rằng
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
10 bỏ qua thông báo lỗi vì nó chỉ nhận được dữ liệu được gửi đến
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
60.

Thư viện tiêu chuẩn Python

Mặc dù các cách tiếp cận khác nhau mà bạn đã thực hiện để xử lý các đối số dòng lệnh Python, bất kỳ chương trình phức tạp nào cũng có thể tốt hơn là tận dụng các thư viện hiện có để xử lý các giao diện dòng lệnh được yêu cầu bởi các giao diện dòng lệnh tinh vi. Kể từ Python 3.7, có ba trình phân tích cú pháp dòng lệnh trong thư viện tiêu chuẩn:leveraging existing libraries to handle the heavy lifting required by sophisticated command line interfaces. As of Python 3.7, there are three command line parsers in the standard library:

  1. # main.py
    import sys
    
    if __name__ == "__main__":
        print(f"Arguments count: {len(sys.argv)}")
        for i, arg in enumerate(sys.argv):
            print(f"Argument {i:>6}: {arg}")
    
    9
  2. $ gcc -o main main.c
    $ ./main
    Arguments count: 1
    Argument      0: ./main
    
    14
  3. $ gcc -o main main.c
    $ ./main
    Arguments count: 1
    Argument      0: ./main
    
    15

Mô -đun được đề xuất để sử dụng từ thư viện tiêu chuẩn là

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
9. Thư viện tiêu chuẩn cũng phơi bày
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
15 nhưng nó chính thức không được dùng và chỉ được đề cập ở đây cho thông tin của bạn. Nó được thay thế bởi
# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
9 trong Python 3.2 và bạn đã giành chiến thắng khi thấy nó được thảo luận trong hướng dẫn này.

# main.py import sys if __name__ == "__main__": print(f"Arguments count: {len(sys.argv)}") for i, arg in enumerate(sys.argv): print(f"Argument {i:>6}: {arg}") 9

Bạn sẽ xem lại

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
08, bản sao gần đây nhất của
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
41, để giới thiệu những lợi ích của
# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
9. Để hiệu ứng này, bạn sẽ sửa đổi
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
08 và thêm
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
24 để khởi tạo
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
25:

C:/>main
Arguments count: 1
Argument      0: main
9

Đối với chi phí của một vài dòng hơn so với triển khai trước đó, bạn sẽ có một cách tiếp cận sạch để thêm các tùy chọn

$ python -c "print('Real Python')"
Real Python
90 và
$ python -c "print('Real Python')"
Real Python
89 mà trước đây đã tồn tại. Các đối số dự kiến ​​(các tệp được xử lý) đều có sẵn trong trường
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
28 của đối tượng
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
29. Đối tượng này được điền trên dòng 17 bằng cách gọi
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
30.

Để xem tập lệnh đầy đủ với các sửa đổi được mô tả ở trên, hãy mở rộng khối mã bên dưới:

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
0

Để minh họa lợi ích ngay lập tức mà bạn có được bằng cách giới thiệu

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
9 trong chương trình này, hãy thực hiện các mục sau:

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
1

Để đi sâu vào các chi tiết của

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
9, hãy xem cách xây dựng các giao diện dòng lệnh trong Python với Argparse.

$ gcc -o main main.c $ ./main Arguments count: 1 Argument 0: ./main 14

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
14 tìm thấy nguồn gốc của nó trong hàm
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
14 C. Nó tạo điều kiện phân tích các tùy chọn dòng lệnh và xử lý, đối số tùy chọn và đối số. Xem lại
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
36 từ
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
68 để sử dụng
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
14:

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
2

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
39 có các đối số sau:

  1. Danh sách đối số thông thường trừ tên tập lệnh,
    $ gcc -o main main.c
    $ ./main
    Arguments count: 1
    Argument      0: ./main
    
    40
  2. Một chuỗi xác định các tùy chọn ngắn
  3. Một danh sách các chuỗi cho các tùy chọn dài

Lưu ý rằng một tùy chọn ngắn theo sau là một dấu hai chấm (

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
41) mong đợi một đối số tùy chọn và một tùy chọn dài được kéo dài với một dấu hiệu bình đẳng (
$ python -c "print('Real Python')"
Real Python
95) mong đợi một đối số tùy chọn.

Mã còn lại của

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
43 giống như
 1// main.c
 2#include 
 3
 4int main(int argc, char *argv[]) {
 5    printf("Arguments count: %d\n", argc);
 6    for (int i = 0; i < argc; i++) {
 7        printf("Argument %6d: %s\n", i, argv[i]);
 8    }
 9    return 0;
10}
68 và có sẵn trong khối mã bị sụp đổ bên dưới:

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
3

Tiếp theo, bạn sẽ xem xét một số gói bên ngoài sẽ giúp bạn phân tích các đối số dòng lệnh Python.

Một vài gói python bên ngoài

Dựa trên các quy ước hiện có mà bạn đã thấy trong hướng dẫn này, có một vài thư viện có sẵn trên Chỉ số gói Python (PYPI) thực hiện nhiều bước nữa để tạo điều kiện cho việc thực hiện và duy trì các giao diện dòng lệnh.

Các phần sau đây cung cấp một cái nhìn thoáng qua về Click và Python Prompt Bộ công cụ. Bạn chỉ được tiếp xúc với khả năng rất hạn chế của các gói này, vì cả hai đều yêu cầu một hướng dẫn đầy đủ nếu không phải là toàn bộ loạt phim để làm cho họ công bằng!

Nhấp chuột

Theo văn bản này, Click có lẽ là thư viện tiên tiến nhất để xây dựng giao diện dòng lệnh tinh vi cho chương trình Python. Nó được sử dụng bởi một số sản phẩm Python, đặc biệt là bình và màu đen. Trước khi bạn thử ví dụ sau, bạn cần cài đặt nhấp vào môi trường ảo Python hoặc môi trường địa phương của bạn. Nếu bạn không quen thuộc với khái niệm môi trường ảo, thì hãy kiểm tra các môi trường ảo Python: một mồi.Click is perhaps the most advanced library to build a sophisticated command line interface for a Python program. It’s used by several Python products, most notably Flask and Black. Before you try the following example, you need to install Click in either a Python virtual environment or your local environment. If you’re not familiar with the concept of virtual environments, then check out Python Virtual Environments: A Primer.

Để cài đặt nhấp chuột, hãy tiến hành như sau:

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
4

Vì vậy, làm thế nào có thể nhấp vào giúp bạn xử lý các đối số dòng lệnh Python? Ở đây, một biến thể của chương trình

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55 bằng cách sử dụng nhấp chuột:

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
5

Cài đặt

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
46 thành
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
47 đảm bảo rằng nhấp chuột không phân tích các đối số tiêu cực là tùy chọn. Số nguyên âm là các đối số
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55 hợp lệ.

Như bạn có thể đã quan sát, bạn nhận được rất nhiều miễn phí! Một vài nhà trang trí được chạm khắc tốt là đủ để chôn mã nồi hơi, cho phép bạn tập trung vào mã chính, đó là nội dung của

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
49 trong ví dụ này.

Nhập duy nhất còn lại là

$ python -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b     : issue warnings about str(bytes_instance), str(bytearray_instance)
         and comparing bytes/bytearray with str. (-bb: issue errors)
[ ... complete help text not shown ... ]
87. Cách tiếp cận khai báo của trang trí lệnh chính,
$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
49, loại bỏ mã lặp đi lặp lại mà nếu không cần thiết. Đây có thể là bất kỳ điều nào sau đây:

  • Xác định quy trình trợ giúp hoặc sử dụng a help or usage procedure
  • Xử lý phiên bản của chương trình the version of the program
  • Nắm bắt và thiết lập các giá trị mặc định cho các tùy chọn and setting up default values for options
  • Xác thực các đối số, bao gồm cả loại arguments, including the type

Việc triển khai

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
55 mới hầu như không làm trầy xước bề mặt. Click cung cấp nhiều tính năng khác sẽ giúp bạn tạo ra một giao diện dòng lệnh rất chuyên nghiệp:

  • Màu đầu ra
  • Nhắc nhở cho các đối số bị bỏ qua
  • Lệnh và lệnh phụ
  • Xác thực loại đối số
  • Gọi lại trên các tùy chọn và đối số
  • Xác thực đường dẫn tệp
  • Thanh tiến trình

Có nhiều tính năng khác là tốt. Kiểm tra viết các công cụ dòng lệnh Python bằng nhấp chuột để xem thêm các ví dụ cụ thể dựa trên nhấp chuột.

Bộ công cụ nhắc nhở Python

Có các gói Python phổ biến khác đang xử lý vấn đề giao diện dòng lệnh, như Docopt cho Python. Vì vậy, bạn có thể tìm thấy sự lựa chọn của bộ công cụ nhắc nhở một chút phản trực giác.

Bộ công cụ nhắc nhở Python cung cấp các tính năng có thể làm cho ứng dụng dòng lệnh của bạn rời khỏi triết lý Unix. Tuy nhiên, nó giúp thu hẹp khoảng cách giữa giao diện dòng lệnh Arcane và giao diện người dùng đồ họa chính thức. Nói cách khác, nó có thể giúp làm cho các công cụ và chương trình của bạn thân thiện với người dùng hơn.Python Prompt Toolkit provides features that may make your command line application drift away from the Unix philosophy. However, it helps to bridge the gap between an arcane command line interface and a full-fledged graphical user interface. In other words, it may help to make your tools and programs more user-friendly.

Bạn có thể sử dụng công cụ này bên cạnh việc xử lý các đối số dòng lệnh Python như trong các ví dụ trước, nhưng điều này cung cấp cho bạn một đường dẫn đến cách tiếp cận giống UI mà không cần bạn phải phụ thuộc vào bộ công cụ UI Python đầy đủ. Để sử dụng

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
53, bạn cần cài đặt nó với
$ python -c "print('Real Python')"
Real Python
10:

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
6

Bạn có thể tìm thấy ví dụ tiếp theo một chút giả định, nhưng ý định là thúc đẩy các ý tưởng và đưa bạn ra khỏi các khía cạnh nghiêm ngặt hơn của dòng lệnh đối với các quy ước mà bạn đã thấy trong hướng dẫn này.

Như bạn đã thấy logic cốt lõi của ví dụ này, đoạn mã bên dưới chỉ trình bày mã lệch đáng kể so với các ví dụ trước:

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
7

Mã ở trên bao gồm các cách để tương tác và có thể hướng dẫn người dùng nhập vào đầu vào dự kiến ​​và để xác thực đầu vào tương tác bằng cách sử dụng ba hộp thoại:

  1. $ gcc -o main main.c
    $ ./main
    Arguments count: 1
    Argument      0: ./main
    
    55
  2. $ gcc -o main main.c
    $ ./main
    Arguments count: 1
    Argument      0: ./main
    
    56
  3. $ gcc -o main main.c
    $ ./main
    Arguments count: 1
    Argument      0: ./main
    
    57

Bộ công cụ Python Prompt phơi bày nhiều tính năng khác nhằm cải thiện sự tương tác với người dùng. Cuộc gọi đến trình xử lý trong

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
08 được kích hoạt bằng cách gọi một hàm được lưu trữ trong từ điển. Kiểm tra các câu lệnh chuyển đổi/trường hợp mô phỏng trong Python nếu bạn không bao giờ gặp phải thành ngữ Python này trước đây.

Bạn có thể thấy ví dụ đầy đủ của chương trình bằng cách sử dụng

$ gcc -o main main.c
$ ./main
Arguments count: 1
Argument      0: ./main
53 bằng cách mở rộng khối mã bên dưới:

# main.py
import sys

if __name__ == "__main__":
    print(f"Arguments count: {len(sys.argv)}")
    for i, arg in enumerate(sys.argv):
        print(f"Argument {i:>6}: {arg}")
8

Khi bạn thực thi mã ở trên, bạn đã chào đón một hộp thoại khiến bạn phải hành động. Sau đó, nếu bạn chọn chuỗi hành động, một hộp thoại khác được hiển thị. Sau khi thu thập tất cả các dữ liệu, tùy chọn hoặc đối số cần thiết, hộp thoại biến mất và kết quả được in ở dòng lệnh, như trong các ví dụ trước:

Hướng dẫn can we pass list as command line argument in python? - chúng ta có thể chuyển danh sách dưới dạng đối số dòng lệnh trong python không?

Khi dòng lệnh phát triển và bạn có thể thấy một số nỗ lực tương tác với người dùng một cách sáng tạo hơn, các gói khác như pyinwirer cũng cho phép bạn tận dụng một cách tiếp cận rất tương tác.

Để khám phá thêm thế giới của giao diện người dùng dựa trên văn bản (TUI), hãy xem các giao diện người dùng console xây dựng và phần bên thứ ba trong hướng dẫn của bạn về chức năng in Python.Text-Based User Interface (TUI), check out Building Console User Interfaces and the Third Party section in Your Guide to the Python Print Function.

Nếu bạn quan tâm đến việc nghiên cứu các giải pháp chỉ dựa vào giao diện người dùng đồ họa, thì bạn có thể xem xét kiểm tra các tài nguyên sau:

  • Cách xây dựng một ứng dụng GUI Python với WxPython
  • Python và Pyqt: Xây dựng máy tính máy tính để bàn GUI
  • Xây dựng một ứng dụng di động với khung Kivy Python

Sự kết luận

Trong hướng dẫn này, bạn đã điều hướng nhiều khía cạnh khác nhau của các đối số dòng lệnh Python. Bạn nên cảm thấy chuẩn bị để áp dụng các kỹ năng sau vào mã của mình:

  • Các quy ước và tiêu chuẩn giả của các đối số dòng lệnh Pythonconventions and pseudo-standards of Python command line arguments
  • Nguồn gốc của
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27 trong Pythonorigins of
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27 in Python
  • Việc sử dụng
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27 để cung cấp sự linh hoạt trong việc chạy các chương trình Python của bạnusage of
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', action='append')
    >>> parser.parse_args('--foo 1 --foo 2'.split())
    Namespace(foo=['1', '2'])
    
    27 to provide flexibility in running your Python programs
  • Các thư viện tiêu chuẩn Python như
    # main.py
    import sys
    
    if __name__ == "__main__":
        print(f"Arguments count: {len(sys.argv)}")
        for i, arg in enumerate(sys.argv):
            print(f"Argument {i:>6}: {arg}")
    
    9 hoặc
    $ gcc -o main main.c
    $ ./main
    Arguments count: 1
    Argument      0: ./main
    
    14 đó là xử lý dòng lệnh trừu tượngPython standard libraries like
    # main.py
    import sys
    
    if __name__ == "__main__":
        print(f"Arguments count: {len(sys.argv)}")
        for i, arg in enumerate(sys.argv):
            print(f"Argument {i:>6}: {arg}")
    
    9 or
    $ gcc -o main main.c
    $ ./main
    Arguments count: 1
    Argument      0: ./main
    
    14 that abstract command line processing
  • Các gói Python mạnh mẽ như
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    87 và
    $ gcc -o main main.c
    $ ./main
    Arguments count: 1
    Argument      0: ./main
    
    65 để cải thiện hơn nữa khả năng sử dụng của các chương trình của bạnpowerful Python packages like
    $ python -h
    usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
    Options and arguments (and corresponding environment variables):
    -b     : issue warnings about str(bytes_instance), str(bytearray_instance)
             and comparing bytes/bytearray with str. (-bb: issue errors)
    [ ... complete help text not shown ... ]
    
    87 and
    $ gcc -o main main.c
    $ ./main
    Arguments count: 1
    Argument      0: ./main
    
    65 to further improve the usability of your programs

Cho dù bạn đang chạy một tập lệnh nhỏ hoặc một ứng dụng dựa trên văn bản phức tạp, khi bạn hiển thị giao diện dòng lệnh, bạn sẽ cải thiện đáng kể trải nghiệm người dùng về phần mềm Python của mình. Trên thực tế, bạn có thể là một trong những người dùng đó!command line interface you’ll significantly improve the user experience of your Python software. In fact, you’re probably one of those users!

Lần tới khi bạn sử dụng ứng dụng của mình, bạn sẽ đánh giá cao tài liệu bạn đã cung cấp với tùy chọn

$ python -c "print('Real Python')"
Real Python
90 hoặc thực tế là bạn có thể truyền các tùy chọn và đối số thay vì sửa đổi mã nguồn để cung cấp dữ liệu khác nhau.

Tài nguyên bổ sung

Để có được những hiểu biết sâu sắc hơn về các đối số dòng lệnh Python và nhiều khía cạnh của chúng, bạn có thể muốn kiểm tra các tài nguyên sau:

  • So sánh các thư viện phân tích cú pháp dòng lệnh Python-Argparse, Docopt và nhấp chuột
  • Python, Ruby và Golang: So sánh ứng dụng dòng lệnh

Bạn cũng có thể muốn thử các thư viện Python khác nhắm mục tiêu các vấn đề tương tự trong khi cung cấp cho bạn các giải pháp khác nhau:

  • Typer
  • Vị trí
  • Vách đá
  • Xi măng
  • Lửa Python

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để làm sâu sắc thêm sự hiểu biết của bạn: Giao diện dòng lệnh trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Command Line Interfaces in Python

Tôi có thể truyền một danh sách như một python đối số không?

Bạn có thể gửi bất kỳ loại dữ liệu nào của đối số đến một hàm (chuỗi, số, danh sách, từ điển, v.v.) và nó sẽ được coi là cùng một loại dữ liệu bên trong hàm..

Là danh sách các đối số dòng lệnh?

sys.argv là danh sách các đối số dòng lệnh.Len (sys.argv) là số lượng đối số dòng lệnh. is the list of command-line arguments. len(sys.argv) is the number of command-line arguments.

Bạn có thể chuyển một danh sách cho * args không?

Khi chỉ định một danh sách hoặc tuple với * là một đối số, nó được giải nén và mỗi phần tử được truyền cho mỗi đối số.Danh sách được sử dụng trong mã mẫu sau, nhưng tương tự áp dụng cho các bộ dữ liệu.. Lists are used in the following sample code, but the same applies to tuples.

Danh sách nào trong Python chứa các đối số được chuyển cho một kịch bản?

Argv là một danh sách trong Python có chứa tất cả các đối số dòng lệnh được truyền cho tập lệnh.Nó là điều cần thiết trong Python trong khi làm việc với các đối số dòng lệnh.Chúng ta hãy xem xét kỹ hơn với ví dụ Sys Argv Python dưới đây.Với Len (sys.