2013-03-19 22 views
5

Tôi đang xây dựng một bộ tập lệnh và mô-đun để quản lý cơ sở hạ tầng của mình. Để giữ cho mọi thứ được tổ chức, tôi muốn củng cố càng nhiều nỗ lực càng tốt và giảm thiểu tấm lò hơi cho các tập lệnh mới hơn.Sử dụng argparse của python trong nhiều tập lệnh được hỗ trợ bởi nhiều mô-đun tùy chỉnh

Cụ thể, vấn đề ở đây là hợp nhất mô-đun ArgumentParser.

Một ví dụ cấu trúc là phải có kịch bản và thư viện tổ chức một cái gì đó như thế này:

|-- bin 
    |-- script1 
    |-- script2 
|-- lib 
    |-- logger 
    |-- lib1 
    |-- lib2 

Trong kịch bản này script1 chỉ có thể tận dụng loggerlib1, trong khi script2 sẽ tận dụng loggerlib2. Trong cả hai trường hợp, tôi muốn logger chấp nhận '-v' và '-d', trong khi script1 cũng có thể chấp nhận thêm args và lib2 các arg khác. Tôi biết điều này có thể dẫn đến va chạm và sẽ quản lý thủ công.

script1

#!/usr/bin/env python 
import logger 
import lib1 
argp = argparse.ArgumentParser("logger", parent=[logger.argp]) 

script2

#!/usr/bin/env python 
import logger 
import lib2 

logger

#!/usr/bin/env python 
import argparse 
argp = argparse.ArgumentParser("logger") 
argp.add_argument('-v', '--verbose', action="store_true", help="Verbose output") 
argp.add_argument('-d', '--debug', action="store_true", help="Debug output. Assumes verbose output.") 

Mỗi kịch bản và đồng lib uld có khả năng có các đối số riêng của nó, tuy nhiên tất cả chúng sẽ được hợp nhất thành một arg_parse cuối cùng()

Các nỗ lực của tôi đã dẫn đến việc không kế thừa/mở rộng thiết lập argp. Làm thế nào điều này có thể được thực hiện ở giữa một tập tin thư viện và kịch bản?

+0

Bạn cho biết chức năng của argparse parents = [parser1, parser2] không hoạt động đối với bạn - chức năng này bị hỏng như thế nào? – babbageclunk

Trả lời

6

Cách đơn giản nhất là có phương pháp trong mỗi mô-đun chấp nhận cá thể ArgumentParser và thêm đối số của riêng nó vào trường hợp đó.

# logger.py 
def add_arguments(parser): 
    parser.add_argument('-v', '--verbose', action="store_true", help="Verbose output") 
    # ... 

# lib1.py 
def add_arguments(parser): 
    parser.add_argument('-x', '--xtreme', action="store_true", help="Extremify") 
    # ... 

Mỗi tập lệnh sẽ tạo ArgumentParser, chuyển đoạn mã đó vào mỗi mô-đun cung cấp đối số và sau đó thêm đối số cụ thể của riêng nó.

# script1.py 
import argparse, logger, lib1 
parser = argparse.ArgumentParser("script1") 
logger.add_arguments(parser) 
lib1.add_arguments(parser) 
# add own args... 
Các vấn đề liên quan