Xem xét yêu cầu
- sử dụng
argparse
(Tôi sẽ bỏ qua cái này)
- cho phép một hoặc hai hành động được gọi (ít nhất một hành động bắt buộc).
- cố gắng bởi Pythonic (tôi muốn gọi nó là giống như "POSIX")
Ngoài ra còn có một số yêu cầu ngầm khi sử dụng dòng lệnh:
- giải thích cách sử dụng cho người dùng theo cách dễ hiểu
- các tùy chọn sẽ là tùy chọn
- cho phép chỉ định cờ và tùy chọn
- cho phép kết hợp với các tham số khác (như tên hoặc tên tệp).
Giải pháp mẫu sử dụng docopt
(tệp managelog.py
):
"""Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Cố gắng chạy nó:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Hiển thị sự trợ giúp:
$ python managelog.py -h
Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> P managelog.py [options] upload -- <logfile>...
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
Và sử dụng nó:
$ python managelog.py -V -U user -P secret upload -- alfa.log beta.log
{'--': True,
'--pswd': 'secret',
'--user': 'user',
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': False,
'upload': True}
Thay thế ngắn short.py
Thậm chí có thể có biến thể ngắn hơn:
"""Manage logfiles
Usage:
short.py [options] (process|upload)... -- <logfile>...
short.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Cách sử dụng trông như thế này:
$ python short.py -V process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 1,
'upload': 1}
Lưu ý rằng thay vì các giá trị boolean cho các khóa "process" và "upload" thì có bộ đếm.
Hóa ra, chúng ta không thể ngăn chặn sự trùng lặp của những từ này:
$ python short.py -V process process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 2,
'upload': 1}
Kết luận
Đôi khi, việc thiết kế giao diện dòng lệnh tốt có thể là một thách thức.
Có nhiều khía cạnh của chương trình dựa trên dòng lệnh:
- thiết kế tốt dòng lệnh
- chọn / sử dụng trình phân tích cú pháp thích hợp
argparse
cung cấp rất nhiều, nhưng hạn chế các tình huống có thể xảy ra và có thể trở nên rất phức tạp.
Mọi docopt
thứ diễn ra ngắn hơn nhiều trong khi vẫn đảm bảo khả năng đọc và cung cấp mức độ linh hoạt cao. Nếu bạn quản lý việc nhận các đối số được phân tích cú pháp từ từ điển và thực hiện một số chuyển đổi (thành số nguyên, mở tệp ..) theo cách thủ công (hoặc bằng thư viện khác được gọi schema
), bạn có thể thấy docopt
phù hợp với phân tích cú pháp dòng lệnh.
-x
thường là một lá cờ và tùy chọn. Cắt-
nếu nó được yêu cầu.