2013-06-18 24 views
5

Làm cách nào để xác định chuỗi tùy ý làm đối số tùy chọn bằng argparse?python - Sử dụng argparse, chuyển một chuỗi tùy ý làm đối số được sử dụng trong tập lệnh

Ví dụ:

[[email protected]]$ ./script.py FOOBAR -a -b 
Running "script.py"... 
You set the option "-a" 
You set the option "-b" 
You passed the string "FOOBAR" 

Lý tưởng nhất, tôi muốn vị trí của các đối số không quan trọng. tức là:

./script.py -a FOOBAR -b == ./script.py -a -b FOOBAR == ./script.py FOOBAR -a -b


Trong BASH, tôi có thể thực hiện điều này khi sử dụng getopts. Sau khi xử lý tất cả các switch mong muốn trong một trường hợp vòng lặp, tôi muốn có một dòng mà đọc shift $((OPTIND-1)), và từ đó tôi có thể truy cập vào tất cả các đối số còn lại sử dụng chuẩn $1, $2, $3, vv ...
Liệu cái gì đó như exisit rằng cho argparse?

+3

Bạn đã đi qua hướng dẫn của argparse chưa? Tất cả mọi thứ bạn đang mô tả là có – SheetJS

+0

Phần duy nhất không được thảo luận iirc là hành vi 'nargs =" * "' (để một đối số vị trí có thể lấy tất cả các đối số còn lại) – SheetJS

+1

@Nirk, Điều phức tạp là nếu bạn chỉ sử dụng 'parse_args', ngay sau khi nó thấy đối số" vị trí ", nó dừng tìm kiếm các đối số khác và thu thập các đối số từ đối số vị trí đến cuối. Điều này là tốt trong hầu hết các trường hợp, nhưng sẽ phá vỡ ví dụ đầu tiên và thứ 3 của mình. – jedwards

Trả lời

6

Để có được chính xác những gì bạn đang tìm kiếm, các trick là sử dụng parse_known_args() thay vì parse_args():

#!/bin/env python 

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('-a', action="store_true") 
parser.add_argument('-b', action="store_true") 

opts = parser.parse_known_args() 
# Print info about flags 
if opts[0].a: print('You set the option "-a"') 
if opts[0].b: print('You set the option "-b"') 
# Collect remainder (opts[1] is a list (possibly empty) of all remaining args) 
if opts[1]: print('You passed the strings %s' % opts[1]) 

EDIT:

Đoạn mã trên sẽ hiển thị thông tin trợ giúp sau:

 
./clargs.py -h 

usage: clargs_old.py [-h] [-a] [-b] 

optional arguments: 
    -h, --help show this help message and exit 
    -a 
    -b 

Nếu bạn muốn thông báo cho người dùng về đối số tùy ý tùy chọn, giải pháp duy nhất tôi có thể nghĩ là phân lớp ArgumentParser và viết nó vào chính bạn.

Ví dụ:

#!/bin/env python 

import os 
import argparse 

class MyParser(argparse.ArgumentParser): 
    def format_help(self): 
     help = super(MyParser, self).format_help() 
     helplines = help.splitlines() 
     helplines[0] += ' [FOO]' 
     helplines.append(' FOO   some description of FOO') 
     helplines.append('') # Just a trick to force a linesep at the end 
     return os.linesep.join(helplines) 

parser = MyParser() 
parser.add_argument('-a', action="store_true") 
parser.add_argument('-b', action="store_true") 

opts = parser.parse_known_args() 
# Print info about flags 
if opts[0].a: print('You set the option "-a"') 
if opts[0].b: print('You set the option "-b"') 
# Collect remainder 
if opts[1]: print('You passed the strings %s' % opts[1]) 

nào hiển thị thông tin trợ giúp sau:

 
./clargs.py -h 

usage: clargs.py [-h] [-a] [-b] [FOO] 

optional arguments: 
    -h, --help show this help message and exit 
    -a 
    -b 
    FOO   some description of FOO 

Lưu ý việc bổ sung các [FOO] trong "sử dụng" dòng và FOO trong sự giúp đỡ dưới "đối số tùy chọn ".

+0

Điều này là tốt, ngoại trừ việc tôi mất hộp thoại trợ giúp cài sẵn từ argparse cho chuỗi tùy chọn. – svenglar

+1

Điều này đúng. Giải pháp duy nhất tôi có thể nghĩ đến là phân lớp ArgumentParser và viết nó vào chính bạn. Lưu ý rằng lý do duy nhất bạn phải nhảy qua vòng này là vì bạn muốn bất kỳ thứ tự nào của các đối số để làm việc.Tôi sẽ chỉnh sửa câu trả lời của tôi với một ví dụ về phân lớp ArgumentParser. – jedwards

+0

Wow, cảm ơn! Có vẻ lạ rằng không có một lựa chọn nào trong argparse để có một đối số tùy chọn là một chuỗi tùy ý ... ồ. Cảm ơn bạn rất nhiều vì câu trả lời này. – svenglar

Các vấn đề liên quan