簡體   English   中英

在 Python3 中結合 argsparse 和 sys.args

[英]combining argsparse and sys.args in Python3

我正在嘗試為 Python 編寫一個可以像這樣運行的命令行工具。

orgtoanki 'b' 'aj.org' --delimiter="~" --fields="front,back"

這是腳本:

#!/usr/bin/env python3
import sys
import argparse

from orgtoanki.api import create_package

parser = argparse.ArgumentParser()
parser.add_argument('--fields', '-f', help="fields, separated by commas", type=str, default='front,back')
parser.add_argument('--delimiter', '-d', help="delimiter", type= str, default='*')
args = parser.parse_args()
name=sys.argv[1]
org_src=sys.argv[2]

create_package(name, org_src, args.fields, agrs.delimiter)

當我運行它時,我收到以下錯誤:

usage: orgtoanki [-h] [--fields FIELDS] [--delimiter DELIMITER]
orgtoanki: error: unrecognized arguments: b aj.org

為什么不將 'b' 和 'ab.org' 分別解釋為sys.argv[1]sys.argv[2]

如果沒有將字段和分隔符提供給命令行,默認值是否會按我的預期工作?

這里的錯誤是由argparse解析器引起的,它無法理解命令的'b' 'aj.org'部分,並且您的代碼永遠不會到達帶有sys.argv的行。 嘗試將這些 arguments 添加到argparse並避免同時使用argparsesys.argv

parser = argparse.ArgumentParser()

# these two lines
parser.add_argument('name', type=str)
parser.add_argument('org_src', type=str)

parser.add_argument('--fields', '-f', help="fields, separated by commas",
                    type=str, default='front,back')
parser.add_argument('--delimiter', '-d', help="delimiter",
                    type= str, default='*')

args = parser.parse_args()

然后,您可以分別在args.nameargs.org_src訪問它們的值。

parser.parse_args的默認輸入是sys.argv[1:]

usage: orgtoanki [-h] [--fields FIELDS] [--delimiter DELIMITER]
orgtoanki: error: unrecognized arguments: b aj.org

錯誤消息由argparse打印,然后是 sys 退出。

該消息意味着它在sys.argv[1:]中找到了未被編程識別的字符串。 您只告訴它“--fields”和“--delimiter”標志。

您可以按照其他人的建議添加兩個位置字段。

或者你可以使用

[args, extras] = parser.parse_known_args()
name, org_src = extras

extras應該是一個列表['b', 'aj.org'] ,即無法識別的 arguments,您可以將其分配給您的 2 個變量。

解析器(通常)不會使用和修改sys.argv 所以幾個解析器( argparse或其他)可以讀取相同的sys.argv 但要使其發揮作用,他們必須寬容他們不需要或不認識的字符串。

暫無
暫無

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

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