2012-07-03 28 views
12

Tôi muốn có cú pháp sau:Python: argparse đối số tùy chọn mà không cần dấu gạch ngang

python utility.py file1 FILE1 file2 FILE2 

nơi file1 và file2 là đối số tùy chọn. Nó là đơn giản để làm cho nó làm việc với các cú pháp sau:

python utility.py --file1 FILE1 --file2 FILE2 

sử dụng

parser.add_argument('--file1',type=file) 
parser.add_argument('--file2',type=file) 

Tuy nhiên, nếu tôi loại bỏ các dấu gạch ngang, argparse bắt đầu phiên dịch nó như là một vị trí chứ không phải là đối số tùy chọn ...

Nói cách khác, có thể nói cụ thể cho argparse xem một đối số là tùy chọn hoặc vị trí để tôi có thể có các tham số tùy chọn không có dấu gạch ngang không?

+2

Cú pháp đó (không có dấu gạch ngang) gây nhầm lẫn là địa ngục! Có một lý do quy ước tồn tại. –

+1

@MartijnPieters: có thể gây nhầm lẫn nhưng đối với một số ứng dụng khoa học, đây là một tiêu chuẩn ... [ví dụ] (http://www.ccp4.ac.uk/html/refmac5/description.html) – jvm

+1

@MartijnPieters: counterexample: giao diện dòng lệnh 'git' hoặc' svn'. –

Trả lời

4

Không có cách nào để nhận được argparse để thực hiện việc này cho bạn. Tuy nhiên, bạn có thể làm cho argparse chấp nhận bất kỳ số lượng đối số vị trí:

parser.add_argument('FILES',nargs='*') 
options=parser.parse_args() 
file1,optional_files=options.FILES[0],options.FILES[1:] 

Tất nhiên, bạn có thể muốn thêm một số kiểm tra để đảm bảo rằng ít nhất 1 tập tin đã được đưa ra, vv

EDIT

Tôi vẫn không chắc chắn 100% những gì bạn muốn ở đây, nhưng nếu file1file2 là chuỗi ký tự, bạn có thể làm việc xung quanh một chút bằng cách xử lý trước sys.argv. Tất nhiên, điều này sẽ vẫn định dạng tin nhắn trợ giúp của bạn một cách kỳ lạ, nhưng bạn luôn có thể thêm một epilog giải thích rằng một trong hai biểu mẫu là OK:

import argparse 
import sys 

mangle_args=('file1','file2') 
arguments=['--'+arg if arg in mangle_args else arg for arg in sys.argv[1:]] 

parser=argparse.ArgumentParser() 
parser.add_argument('--file1') 
parser.add_argument('--file2') 
options=parser.parse_args(arguments) 
+0

Đối số vị trí không đủ cho tôi. Ví dụ, file1 có thể bị bỏ qua, file2 được nhập vào, file3 bị bỏ qua, file4 được nhập vào và nhiệm vụ là quan trọng (nghĩa là tôi cần phải biết rằng đó là tệp 2 và file4 được người dùng chỉ định) – jvm

+1

@jvm - argparse như thế nào (hoặc bất cứ điều gì) phải biết rằng các tập tin bạn đã cho là 'file2' thay vì' file1'? Nếu bạn không thể phân loại nó từ thứ tự nó xuất hiện trên dòng lệnh, chắc chắn 'argparse' cũng không thể làm được. – mgilson

+0

Các chuỗi liên tục 'file1' và' file2', hay là tên của các tệp - có thể đó là những gì tôi không hiểu ở đây ... – mgilson