Memiliki opsi dalam argparse dengan tanda hubung


154

Saya ingin memiliki beberapa opsi dalam modul argparse seperti --pm-exportnamun ketika saya mencoba menggunakannya seperti args.pm-exportsaya mendapatkan kesalahan bahwa tidak ada atribut pm. Bagaimana saya bisa mengatasi masalah ini? Apakah mungkin untuk memiliki -opsi baris perintah?

Jawaban:


226

Seperti yang ditunjukkan dalam argparsedokumen :

Untuk tindakan argumen opsional, nilai dest biasanya disimpulkan dari string opsi. ArgumentParser menghasilkan nilai dest dengan mengambil string opsi panjang pertama dan menghapus --string awal . Setiap -karakter internal akan dikonversi ke _karakter untuk memastikan string adalah nama atribut yang valid

Jadi, Anda harus menggunakan args.pm_export.


108

Sayangnya, penggantian garis bawah ke garis bawah tidak berfungsi untuk argumen posisional (tidak diawali oleh --) seperti

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>)

Jadi, Anda harus menggunakan argumen pertama add_argument()sebagai nama atribut dan metavarkwarg untuk mengatur bagaimana seharusnya terlihat dalam bantuan:

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
Laporan bug Python yang relevan: bugs.python.org/issue15125 . argparsemenggunakan setattrdan getattr, jadi destnama tidak harus dotnama atribut yang valid . Pengguna juga bisa menggunakan getattr.
hpaulj

5
Saya hanya akan melakukanpositional_arg = getattr( parser, 'positional-arg' )
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
Apa yang saya butuhkan - saya melakukannya dengan mundur metavardan tidak tahu mengapa itu tidak berhasil. Terima kasih!
dwanderson

17

Tanda hubung dikonversi menjadi garis bawah:

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

4
Hanya untuk argumen opsional. Yang diperlukan untuk menjaga tanda hubung mereka, jadi perlu garis bawah agar dapat diakses.
pukul
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.