Có các tùy chọn trong argparse với một dấu gạch ngang


154

Tôi muốn có một số tùy chọn trong mô-đun argparse, --pm-exporttuy nhiên khi tôi cố gắng sử dụng nó như args.pm-exporttôi gặp lỗi không có thuộc tính pm. Làm thế nào tôi có thể khắc phục vấn đề này? Có thể có -trong các tùy chọn dòng lệnh?

Câu trả lời:


226

Như đã nêu trong các argparsetài liệu :

Đối với các hành động đối số tùy chọn, giá trị của mệnh thường được suy ra từ các chuỗi tùy chọn. ArgumentParser tạo ra giá trị của mệnh bằng cách lấy chuỗi tùy chọn dài đầu tiên và tước --chuỗi ban đầu . Mọi -ký tự bên trong sẽ được chuyển đổi thành _ký tự để đảm bảo chuỗi là tên thuộc tính hợp lệ

Vì vậy, bạn nên sử dụng args.pm_export.


108

Thật không may, thay thế dấu gạch ngang để gạch dưới không hoạt động đối với các vị trí theo vị trí (không được tiền tố bởi --) như

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('logs-dir',
                    help='Directory with .log and .log.gz files')
parser.add_argument('results-csv', type=argparse.FileType('w'),
                    default=sys.stdout,
                    help='Output .csv filename')
args = parser.parse_args()
print args

# gives
# Namespace(logs-dir='./', results-csv=<open file 'lool.csv', mode 'w' at 0x9020650>)

Vì vậy, bạn nên sử dụng đối số 1 để add_argument()làm tên thuộc tính và metavarkwarg để đặt cách nó sẽ tìm trong trợ giúp:

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('logs_dir', metavar='logs-dir',
                    nargs=1,
                    help='Directory with .log and .log.gz files')
parser.add_argument('results_csv', metavar='results-csv',
                    nargs=1,
                    type=argparse.FileType('w'),
                    default=sys.stdout,
                    help='Output .csv filename')
args = parser.parse_args()
print args

# gives
# Namespace(logs_dir=['./'], results_csv=[<open file 'lool.csv', mode 'w' at 0xb71385f8>])

7
Báo cáo lỗi Python có liên quan: bug.python.org/su15125 . argparsesử dụng setattrgetattr, vì vậy desttên không phải là dottên thuộc tính hợp lệ . Người dùng cũng có thể sử dụng getattr.
hpaulj

5
Tôi chỉ cần làmpositional_arg = getattr( parser, 'positional-arg' )
Ciro Santilli 郝海东 冠状 病 六四

1
Chính xác những gì tôi cần - tôi đã làm điều đó ngược lại metavarvà không thể hiểu tại sao nó không hoạt động. Cảm ơn!
lùn

17

Dấu gạch ngang được chuyển đổi thành dấu gạch dưới:

import argparse
pa = argparse.ArgumentParser()
pa.add_argument('--foo-bar')
args = pa.parse_args(['--foo-bar', '24'])
print args # Namespace(foo_bar='24')

4
Chỉ cho các đối số tùy chọn. Những cái bắt buộc để giữ dấu gạch nối của chúng, vì vậy cần có dấu gạch dưới để làm cho chúng có thể truy cập được.
n00dle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.