如何创建参数解析器
How to create Argument Parser
我是 python 中 argparser
的新手。我正在尝试为包含两个函数 download
和 upload
文件 on/from 框的文件创建 argparser
。根据我正在尝试为该文件创建解析器如下所示,它一次只会执行一项功能,但它对我不起作用:
parser = argparse.ArgumentParser(description='Download or Upload file on box.')
parser.add_argument('-df', '--download', required=True,
help='download file box')
parser.add_argument('-uf', '--upload', nargs='+', required=True,
help='upload file of box')
parser.add_argument('-fp', '--filepath', required=True,
help='file path to upload(which file to upload) or download(where to download file)')
parser.add_argument('-fn', '--filename', required=True,
help='what should be the name of file on box')
parser.add_argument('-fi', '--fileid', required=True,
help='file id of file to download from box')
args = vars(parser.parse_args())
注意 :- 每次只有 -df
或 -uf
选项会出现, -fp
对两者都是必需的,如果它是-df
那么 -fi
是唯一的选项,它是强制性的,如果 -uf
那么 -fn
是唯一的选项,它是强制性的。
我如何实现这一点,以下是我如何将参数传递给文件的示例
pyhton abc.py -df -fp 'Download/boxfile/xyz.txt' -fi 123
python abc.py -uf -fp 'Download/boxfile/xyz.txt' -fn 'qwe.txt'
我对 argparse 不是很熟悉,但是通过阅读文档,我认为没有办法使用 mutually_exclusive_group
和 required
来强制执行此操作。似乎需要条件语句或等效语句来确认传递了有效的参数组合。
参见:Python Argparse conditionally required arguments
我建议您摆脱大部分这些争论,也许是全部,并考虑标准的 Unix 做事方式。
考虑 scp,其语法为:scp source destination
例如:scp Download/boxfile/xyz.txt qwe.txt
如果你不提供目的地,它会推断你希望文件被称为相同的东西,并降落在这里,所以这两个东西是等价的:
scp Download/boxfile/xyz.txt xyz.txt
scp Download/boxfile/xyz.txt
当然,scp 可以通过 Internet 与机器通信,因此有一种格式:
scp hostname:Download/boxfile/xyz.txt xyz.txt
如果您正在上传,只需切换顺序即可:
scp xyz.txt hostname:Download/boxfile/xyz.txt
正如所写,所有 5 个论点都是 required
- 你说得很明确。如果那是您真正想要的,那么其余所有问题都无关紧要。无论如何,您都必须提供全部 5 个。
但评论表明您想要使用 -df
或 -uf
,但可能不会同时使用这两者(虽然不清楚)。
虽然 argparse
中有 mutually_exclusive_mechanism
,但没有 inclusive
等价物 - 如果 -f
存在,则 -g
也必须给出。
但是subparsers
机制可以这样使用。您可以使用必需的 -fi
参数定义 download
子解析器。还有一个 upload
有自己的参数。
另一种选择是设置 -df
接受 2 个参数 (nargs=2
),它的 box
和 file
.
如果-df
和-uf
互斥,为什么不对文件名使用相同的参数?也就是说,将 -fn
和 -fi
替换为一个 file
参数。
另一种选择是使所有(或大部分)参数都不是必需的,并在解析后检查正确的组合。在您自己的代码中实现复杂的逻辑比强制 argparse
为您做更容易。
例如
if args.download is not None: # not default
<check for `args.filename`> etc
为可选参数提供默认值也是一个好主意。这样,即使用户没有提供所有项目,代码也可以 运行。
关于风格问题。带有 -
的短选项标志通常是单个字符。 -d
、-u
等。将多个字符串组合成一个字符串的能力仅在这种情况下有效,例如-df foo
。在这种情况下,这可能无关紧要,因为您的参数 none 是 store_true
.
我是 python 中 argparser
的新手。我正在尝试为包含两个函数 download
和 upload
文件 on/from 框的文件创建 argparser
。根据我正在尝试为该文件创建解析器如下所示,它一次只会执行一项功能,但它对我不起作用:
parser = argparse.ArgumentParser(description='Download or Upload file on box.')
parser.add_argument('-df', '--download', required=True,
help='download file box')
parser.add_argument('-uf', '--upload', nargs='+', required=True,
help='upload file of box')
parser.add_argument('-fp', '--filepath', required=True,
help='file path to upload(which file to upload) or download(where to download file)')
parser.add_argument('-fn', '--filename', required=True,
help='what should be the name of file on box')
parser.add_argument('-fi', '--fileid', required=True,
help='file id of file to download from box')
args = vars(parser.parse_args())
注意 :- 每次只有 -df
或 -uf
选项会出现, -fp
对两者都是必需的,如果它是-df
那么 -fi
是唯一的选项,它是强制性的,如果 -uf
那么 -fn
是唯一的选项,它是强制性的。
我如何实现这一点,以下是我如何将参数传递给文件的示例
pyhton abc.py -df -fp 'Download/boxfile/xyz.txt' -fi 123
python abc.py -uf -fp 'Download/boxfile/xyz.txt' -fn 'qwe.txt'
我对 argparse 不是很熟悉,但是通过阅读文档,我认为没有办法使用 mutually_exclusive_group
和 required
来强制执行此操作。似乎需要条件语句或等效语句来确认传递了有效的参数组合。
参见:Python Argparse conditionally required arguments
我建议您摆脱大部分这些争论,也许是全部,并考虑标准的 Unix 做事方式。
考虑 scp,其语法为:scp source destination
例如:scp Download/boxfile/xyz.txt qwe.txt
如果你不提供目的地,它会推断你希望文件被称为相同的东西,并降落在这里,所以这两个东西是等价的:
scp Download/boxfile/xyz.txt xyz.txt
scp Download/boxfile/xyz.txt
当然,scp 可以通过 Internet 与机器通信,因此有一种格式:
scp hostname:Download/boxfile/xyz.txt xyz.txt
如果您正在上传,只需切换顺序即可:
scp xyz.txt hostname:Download/boxfile/xyz.txt
正如所写,所有 5 个论点都是 required
- 你说得很明确。如果那是您真正想要的,那么其余所有问题都无关紧要。无论如何,您都必须提供全部 5 个。
但评论表明您想要使用 -df
或 -uf
,但可能不会同时使用这两者(虽然不清楚)。
虽然 argparse
中有 mutually_exclusive_mechanism
,但没有 inclusive
等价物 - 如果 -f
存在,则 -g
也必须给出。
但是subparsers
机制可以这样使用。您可以使用必需的 -fi
参数定义 download
子解析器。还有一个 upload
有自己的参数。
另一种选择是设置 -df
接受 2 个参数 (nargs=2
),它的 box
和 file
.
如果-df
和-uf
互斥,为什么不对文件名使用相同的参数?也就是说,将 -fn
和 -fi
替换为一个 file
参数。
另一种选择是使所有(或大部分)参数都不是必需的,并在解析后检查正确的组合。在您自己的代码中实现复杂的逻辑比强制 argparse
为您做更容易。
例如
if args.download is not None: # not default
<check for `args.filename`> etc
为可选参数提供默认值也是一个好主意。这样,即使用户没有提供所有项目,代码也可以 运行。
关于风格问题。带有 -
的短选项标志通常是单个字符。 -d
、-u
等。将多个字符串组合成一个字符串的能力仅在这种情况下有效,例如-df foo
。在这种情况下,这可能无关紧要,因为您的参数 none 是 store_true
.