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
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 9 xử lý 0 giống như 1 2 3 4 3 6 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 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.
Trong trường hợp này, bạn sẽ vượt qua 9 một lần cho mỗi mục danh sách. Sử dụng ví dụ Ops: 00 sẽ dẫn đến 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?
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ệnhGiao 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:
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:
Trong ví dụ đầu tiên này, Trình thông dịch Python sử dụng tùy chọn 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 02 dưới dạng chương trình Python.command, which says to execute the Python command line arguments following the option 02 as a Python program.Một ví dụ khác cho thấy cách gọi Python với 04 để hiển thị trợ giúp:
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 cCá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ư 05, 06 hoặc 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:
Dòng 4 xác định 08, là điểm nhập của chương trình C. Lưu ý tốt về các tham số:
Bạn có thể biên dịch mã ở trên trên Linux với 11, sau đó thực thi với 12 để có được các mục sau:
Trừ khi được thể hiện rõ ràng ở dòng lệnh với tùy chọn 13, 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 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 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:
Đầu ra cho thấy số lượng đối số là 16 và danh sách các đối số bao gồm tên của chương trình, 17, theo sau là mỗi từ của cụm từ 18, mà bạn đã chuyển ở dòng lệnh.Việc tổng hợp 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:
Nếu bạn đã cài đặt Microsoft Visual Studio hoặc Windows Build Tools, thì bạn có thể biên dịch 19 như sau:Bạn sẽ có được một thực thi có tên 23 mà bạn có thể bắt đầu với:
Bạn có thể thực hiện một chương trình Python, 24, tương đương với chương trình C, 19, bạn đã thấy ở trên:
Bạn không thấy một biến 09 như trong ví dụ mã C. Nó không tồn tại trong Python vì 27 là đủ. Bạn có thể phân tích các đối số dòng lệnh Python trong 27 mà không cần phải biết độ dài của danh sách và bạn có thể gọi 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 30, khi được áp dụng cho một ITable, trả về một đối tượng 31 có thể phát ra các cặp liên kết chỉ số của một phần tử trong 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 27 mà không phải duy trì bộ đếm cho chỉ mục trong danh sách.Thực thi 24 như sau:
27 chứa thông tin giống như trong chương trình C:
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:
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 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: 0Hiể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: 1Kế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ố: 2Nhờ 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 ( 43): 3Shell chuyển đổi 44 thành 19 và 24, là hai tệp phù hợp với mẫu 44 trong thư mục hiện tại và chuyển chúng đến 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, 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: 4Trước tiên, bạn nhập tên của chương trình, 41, tiếp theo là Enter, và sau đó 51 và 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 53. Tên của tệp là 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 51 and 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 53. The name of the file is 54. This is a convention to indicate the standard input. The hash value is the same when you execute the following commands: 5Tiếp theo, bạn sẽ đọc một mô tả ngắn về 55.>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append') >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['1', '2']) 55 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 55, bạn có thể hiển thị trợ giúp tại dòng lệnh: 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à 41 và 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, 41 và 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 41 và 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:
Đâ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']) 27Trướ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 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 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:
Bắt đầu nào! Hiển thị đối sốMô -đun 70 hiển thị một mảng có tên 10 bao gồm các mục sau:
Ví dụ sau đây cho thấy nội dung của 27: 7Ở đây, cách thức hoạt động của mã này:
Thực hiện tập lệnh 78 ở trên với danh sách các đối số tùy ý như sau: 8Đầu ra xác nhận rằng nội dung của 79 là tập lệnh Python 78 và các yếu tố còn lại của danh sách 27 chứa các đối số của tập lệnh, 82.Để tóm tắt, 27 chứa tất cả các đối số dòng lệnh Python 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 27 với các đối số.
Đảo ngược đối số đầu tiênBây giờ bạn có đủ nền trên 27, bạn sẽ hoạt động trên các đối số được truyền ở dòng lệnh. Ví dụ 87 đảo ngược đối số đầu tiên được truyền ở dòng lệnh: 9Trong 87, quá trình đảo ngược đối số đầu tiên được thực hiện với các bước sau:
Bạn thực thi tập lệnh như sau: 0Đúng như dự đoán, 87 hoạt động trên 95 và đảo ngược đối số duy nhất để xuất ra 96. Lưu ý rằng xung quanh chuỗi đa từ 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 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 27. Truy cập toàn cầu này có thể thuận tiện, nhưng 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 27. This global access might be convenient, but 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 27: 1Bạn gọi 03 để xóa và trả lại mục cuối cùng trong 27.Thực hiện tập lệnh ở trên: 2Lưu ý rằng đối số thứ tư không còn được bao gồm trong 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 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: 3Lần này, mặc dù 27 bị mất yếu tố cuối cùng, 08 đã được bảo tồn một cách an toàn. 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, 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 10: 4Trong đoạn mã này được lấy từ mã nguồn 10, 08 lưu vào 08, lát cắt của 27 chỉ chứa các đối số chứ không phải tên tệp. 27 vẫn chưa được xử lý và 08 bị ảnh hưởng bởi bất kỳ thay đổi vô tình nào đối với 27.Thoát khỏi các ký tự khoảng trắngTrong ví dụ 87 mà bạn đã thấy trước đó, đối số đầu tiên và duy nhất là 95 và kết quả là 96. Đối số bao gồm một khoảng cách khoảng trắng giữa 22 và 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:
Không có một trong các giải pháp thoát, 87 lưu trữ hai đối số, 22 trong 29 và 23 trong 31: 5Đầu ra ở trên cho thấy tập lệnh chỉ đảo ngược 22 và 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 ( 25).Bạn cũng có thể sử dụng dấu gạch chéo ngược ( 26) để thoát khỏi khoảng trắng: 6Với dấu gạch chéo ngược ( 26), Shell lệnh hiển thị một đối số duy nhất cho Python, và sau đó là 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, 38, có thể được hiển thị bằng cách chạy lệnh sau:delimiters. The content of the shell variable, 38, can be displayed by running the following command: 7Từ kết quả ở trên, 39, bạn xác định ba dấu phân cách:
Tiền tố một không gian có dấu gạch chéo ngược ( 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 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 ( 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 ( 46).space, tab, or pipe ( 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: 8Trong ví dụ trên, bạn có thể suy luận trực giác rằng 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: 9Lời nhắc lệnh chuyển toàn bộ chuỗi 95 như một đối số duy nhất, theo cách tương tự như thể đối số là 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ụ: 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, 87 expects one argument, and if you omit it, then you get an error: 0Ngoại lệ 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 52. Thông điệp của ngoại lệ là 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 27 tại Index 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 52 trong khối 57. Sửa đổi mã như sau: 1Biểu thức trên dòng 4 được bao gồm trong khối 57. Dòng 8 làm tăng ngoại lệ tích hợp 59. Nếu không có đối số nào được chuyển đến 60, thì quá trình này thoát ra với mã trạng thái là 89 sau khi in cách sử dụng. Lưu ý sự tích hợp của 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: 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 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 89, hiển thị khi bạn in biến đặc biệt 66 với 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']) 41Bạ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ố: 3Điều này được truyền cảm hứng một cách lỏng lẻo bởi 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 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:
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: 4Để giữ ngắn gọn ví dụ, tập lệnh 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 60.Từ tài liệu 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 77. Bằng cách trực tiếp lấy các byte từ 29, bạn không cần phải thực hiện chuyển đổi chuỗi thành bytes của 71: 5Sự khác biệt chính giữa 70 và 81 được tô sáng trong các dòng sau:
Thực thi 81 để so sánh đầu ra: 6Giá trị thập lục phân của băm SHA1 giống như trong ví dụ 70 trước đó.Giải phẫu của dòng lệnh PythonBâ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à 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:
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ẩnMộ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á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 đó:
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 04 hoặc 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 ( 00). Ví dụ: để hiển thị trợ giúp, tùy chọn thông thường là 04 và tùy chọn dài là 90.long option that’s a fully named option prefixed with two hyphens ( 00). For example, to display the help, the regular option is 04 and the long option is 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ọnMộ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 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 03 on Linux lists the content of a given directory. Without any arguments, it lists the files and directories in the current directory: 7Hãy để thêm một vài tùy chọn. Bạn có thể kết hợp 04 và 05 thành 06, thay đổi thông tin được hiển thị trong thiết bị đầu cuối: 8Mộ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 07 bên dưới:option can take an argument, which is called an option-argument. See an example in action with 07 below: 9
17 and displays the first 16 bytes of the file in hexadecimal format. The option 10 expects a type as an option-argument, and 11 expects the number of input bytes.Trong ví dụ trên, 10 được đưa ra loại 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 14 để hiển thị các ký tự có thể in ở cuối dòng đầu vào. 11 lấy 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ậnCá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 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 17, which is used to copy one or more files to a file or a directory, takes at least one source and one target: 0Trong dòng 4, 17 có hai đối số:
Sau đó, nó sao chép nội dung của 17 vào một tệp mới có tên 20. Cả 17 và 20 đều là đối số hoặc toán hạng của chương trình 17.Tiểu banKhá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 26, 27, 28 và 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 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 31:
Trong hệ sinh thái Python, 10 cũng có khái niệm về các tiểu ban. Một số tiểu ban 10 bao gồm 41, 42, 43 hoặc 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 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ư 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 45 trong dấu nhắc lệnh trên Windows: 1Lư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 ( 48) thay vì dấu gạch nối ( 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, 50 và tùy chọn 51, nhưng nó cũng đúng như loại 52.Ví dụ cụ thể ở trên thực thi 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: 2Lệnh 46 ở trên cho thấy tất cả các quy trình 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 46 được chuyển đổi bởi hai bộ lọc 57. Lệnh 57 đầu tiên chọn tất cả các lần xuất hiện của 55 và 57 thứ hai lọc ra sự xuất hiện của chính 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 ảnhKhi 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:
Lấy lệnh sau đây mà dự định thực hiện chương trình 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à 67 và 68. 3Trong 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:
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: Trong chương trình Python 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 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 24.Một vài phương pháp để phân tích các đối số dòng lệnh PythonBâ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:
Đ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à đủ: 4Mụ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:
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:
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: 5Cá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:
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ư 9 hoặc 87.Biểu cảm thường xuyênBạ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 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 89 có thể là: 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: 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 55. Cụ thể, lệnh có thể lấy:
Để rõ ràng, mẫu 00 ở trên sử dụng cờ 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:
Để 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 (): 8Điều này làm cho 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 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: 9Mẫ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ố. 08 đang áp dụng 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ị 06 là 90, thì từ điển là 12. Nếu 06 là 14, thì từ điển sẽ trở thành 15. Bạn có thể mở rộng khối mã bên dưới để xem việc triển khai 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 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: 55 with a regular expression to handle the command line parsing and validation: 0Bạ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 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 19 bằng 20. Một khối 21 bổ sung cũng sẽ cần thiết trong 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 tinBâ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 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 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 70 to handle one or more files as arguments. You’ll end up with a downgraded version of the original 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: 1 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 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 27 sau khi mở một tệp có chế độ 28 sẽ trả về một đối tượng 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 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 41: 2Việ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: 3Bở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 24, hiển thị từng đối số với số đối số và giá trị của nó: 4Bạ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 17, bất kể phần mở rộng, là một phần của 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 24 để làm việc với việc mở rộng ký tự đại diện, bạn có thể sử dụng 36. Ví dụ sau đây hoạt động trên Windows và mặc dù nó không ngắn gọn như 24 ban đầu, cùng một mã hoạt động tương tự nhau trên các nền tảng: 5Trong 38, 39 dựa vào 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: 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ị ( 43) hoặc dấu câu hỏi ( 42), nhưng làm thế nào về 43?Nếu bạn không chuyển bất kỳ tham số nào cho tiện ích 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ừ 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
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ẩnKhi bạn sửa đổi triển khai Python trước đó của 41 để xử lý đầu vào tiêu chuẩn bằng cách sử dụng 47, bạn sẽ đến gần hơn với 41 gốc: 7Hai quy ước được áp dụng cho phiên bản 41 mới này:
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: 8Bạn cũng có thể bao gồm một trong các đối số dưới dạng 43 được trộn với các đối số tệp khác như vậy: 9Một cách tiếp cận khác trên các hệ thống giống UNIX là cung cấp 53 thay vì 54 để xử lý đầu vào tiêu chuẩn: 0Trên Windows, không có tương đương với 53, do đó, sử dụng 54 làm đối số tệp hoạt động như mong đợi.Kịch bản 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ẩnXử lý dòng lệnh có thể có mối quan hệ trực tiếp với 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:
Đầ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: 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: 2Thực hiện tập lệnh Python ở trên đưa ra: 3Ellipsis ( 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: 4Bạ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 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à 61: 5Thực hiện 65 để quan sát những điều sau: 6Bâ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 63.Phân tích cú pháp tùy chỉnhBạn có thể thực hiện 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 68 có thể như sau: 7 08 được đưa ra danh sách các đối số mà không có tên tệp Python và sử dụng 70 để nhận được lợi ích của 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 08, bạn có thể quan sát như sau:
Một phiên bản đầy đủ của mã cho 08 có sẵn bên dưới: 8Lư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:
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 PythonBạ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ư 77 và 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 ( 05) hoặc dạng dài ( 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 ( 05) or long-form ( 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 PythonSau đâ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: 9Trừ khi bạn vượt qua tùy chọn 90 tại dòng lệnh, tập lệnh này mong đợi hai hoặc ba đối số:
Bởi vì tất cả các mục trong 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ố. 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 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 40 with the values of the converted arguments, you obtain two validations:
Bạn có thể thấy điều này trong hành động với việc thực thi sau: 0Trong 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: 1Kết quả cũng thành công vì trường 84 được xác định với giá trị mặc định, 91, do đó lớp dữ liệu 40 không yêu cầu.default value, 91, so the data class 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: 2Giá trị dự kiến 93, được bao quanh bởi các trích dẫn, do đó, nó chia tách. Từ thứ hai của họ, 94, là một chuỗi mà xử lý theo tuổi, dự kiến sẽ là một 95. Việc xác nhận thất bại.Tương tự, bạn cũng có thể sử dụng 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ừ 96 và 98 sẽ thay đổi như sau: 3A 96 hiển thị các chức năng như 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ư 01, đây là loại lưu trữ từ điển cho mỗi trường và để biết thêm về 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ỉnhKhô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 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: 4 04 không tồn tại, nhưng chương trình cố gắng đọc nó.Xem lại 08 trong 57 để xử lý các tệp không tồn tại được truyền ở dòng lệnh: 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: 6Khi 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: 7Lưu ý rằng lỗi được hiển thị cho thiết bị đầu cuối được ghi vào 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 08: 8Lệnh này cung cấp đầu ra của 08 đến 10 chỉ bao gồm trường đầu tiên. Bạn có thể thấy rằng 10 bỏ qua thông báo lỗi vì nó chỉ nhận được dữ liệu được gửi đến 60.Thư viện tiêu chuẩn PythonMặ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:
Mô -đun được đề xuất để sử dụng từ thư viện tiêu chuẩn là 9. Thư viện tiêu chuẩn cũng phơi bày 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 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}") 9Bạn sẽ xem lại 08, bản sao gần đây nhất của 41, để giới thiệu những lợi ích của 9. Để hiệu ứng này, bạn sẽ sửa đổi 08 và thêm 24 để khởi tạo 25: 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 90 và 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 28 của đối tượng 29. Đối tượng này được điền trên dòng 17 bằng cách gọi 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: 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 9 trong chương trình này, hãy thực hiện các mục sau: 1Để đi sâu vào các chi tiết của 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 14 tìm thấy nguồn gốc của nó trong hàm 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 36 từ 68 để sử dụng 14: 2 39 có các đối số sau:
Lưu ý rằng một tùy chọn ngắn theo sau là một dấu hai chấm ( 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 ( 95) mong đợi một đối số tùy chọn.Mã còn lại của 43 giống như 68 và có sẵn trong khối mã bị sụp đổ bên dưới: 3Tiế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àiDự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ộtTheo 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: 4Vì 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 55 bằng cách sử dụng nhấp chuột: 5Cài đặt 46 thành 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ố 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 49 trong ví dụ này.Nhập duy nhất còn lại là 87. Cách tiếp cận khai báo của trang trí lệnh chính, 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:
Việc triển khai 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:
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ở PythonCó 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 53, bạn cần cài đặt nó với 10: 6Bạ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: 7Mã ở 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:
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 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 53 bằng cách mở rộng khối mã bên dưới: 8Khi 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: 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:
Sự kết luậnTrong 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:
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 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:
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:
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. |