簡體   English   中英

蟒蛇 2.7。 解析輸入參數

[英]Python 2.7. Parse input parameters

一天中的好時光! 首先,讓我說我是 Python 世界的新手。 我在解析輸入參數時遇到問題。 目前我正在使用 Python 2.7和名為argparse模塊。 我正在嘗試設計能夠解析簡單輸入參數的簡單應用程序。 這是一個簡短的例子:

my_app.py 同步 --force

第二個例子:

my_app.py 補丁 --branch

我看到為此我可以使用add_argument ,它可以與位置和可選參數一起使用。 就像在我的情況下,我想要很少的位置(但同時是可選的)和一些可選的參數。 為此,我設計了小腳本

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='My App')
    parser.add_argument('sync', type=bool, const=True, nargs='?')
    parser.add_argument('-f', '--force', dest='sync_force', type=bool, const=True, nargs='?')
    parser.add_argument('-b', '--branch', type=str, const=True, nargs='?')
    parser.add_argument('-u', '--url', type=str, const=True, nargs='?')
    parser.add_argument('patch', type=bool, const=True, nargs='?')
    parser.add_argument('revert', type=bool, const=True, nargs='?')
    parser.add_argument('verify', type=bool, const=True, nargs='?')

    values = parser.parse_args()

    if values.revert:
        handler.revert()
    else:
        parser.print_help()

我看到我可以使用nargs='?' 將位置參數指定為可選,但是每次我調用我的腳本時,它都會顯示我將 ' sync ' 作為輸入參數,即使我指定了 ' patch '。 所以,我認為它只顯示了第一個添加的元素。 你能告訴我出了什么問題,哪里出了問題嗎?

更新:我試圖實現一種情況,即我將能夠同時只有一個位置參數(並且至少有一個,但帶有任何其他可選參數)。 例如

my_app.py 同步

my_app.py 路徑

my_app.py 驗證 --force

my_app.pyrevert --branch

和:

import argparse

if __name__ == '__main__':

    parser = argparse.ArgumentParser(description='My App')
    parser.add_argument('cmd', choices=['sync','patch', 'revert','verify'])
    parser.add_argument('-f', '--force', action='store_true')
    parser.add_argument('-b', '--branch')
    parser.add_argument('-u', '--url')

    args = parser.parse_args()
    print(args)
    if args.cmd in ['revert']:
        print('handler.revert()')
    else:
        parser.print_help()

測試

1243:~/mypy$ python stack60327766.py 
usage: stack60327766.py [-h] [-f] [-b BRANCH] [-u URL]
                        {sync,patch,revert,verify}
stack60327766.py: error: too few arguments
1244:~/mypy$ python stack60327766.py revert
Namespace(branch=None, cmd='revert', force=False, url=None)
handler.revert()
1244:~/mypy$ python stack60327766.py revert -f -b foobar -u aurl
Namespace(branch='foobar', cmd='revert', force=True, url='aurl')
handler.revert()
1244:~/mypy$ python stack60327766.py verify-f -b foobar -u aurl
usage: stack60327766.py [-h] [-f] [-b BRANCH] [-u URL]
                        {sync,patch,revert,verify}
stack60327766.py: error: argument cmd: invalid choice: 'verify-f' (choose from 'sync', 'patch', 'revert', 'verify')
1245:~/mypy$ python stack60327766.py verify -f -b foobar -u aurl
Namespace(branch='foobar', cmd='verify', force=True, url='aurl')
usage: stack60327766.py [-h] [-f] [-b BRANCH] [-u URL]
                        {sync,patch,revert,verify}

My App

positional arguments:
  {sync,patch,revert,verify}

optional arguments:
  -h, --help            show this help message and exit
  -f, --force
  -b BRANCH, --branch BRANCH
  -u URL, --url URL

argparse命令本機支持

改編自上述鏈接的文檔,

parser = argparse.ArgumentParser()
parser.add_argument('--foo')
subparsers = parser.add_subparsers()
sync_parser = subparsers.add_parser('sync')
patch_parser = subparsers.add_parser('patch')
revert_parser = subparsers.add_parser('revert')
verify_parser = subparsers.add_parser('verify')

等可能是你正在尋找的。

除此之外,我只能推薦Click庫以獲得更流暢的 CLI 界面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM