Argparse 可选位置参数?

2025-03-04 08:27:00
admin
原创
79
摘要:问题描述:我有一个脚本,其用途如下:usage: installer.py dir [-h] [-v] dir是一个位置参数,其定义如下:parser.add_argument('dir', default=os.getcwd()) 我希望dir是可选的:当没有指定时,它应该只是cwd。不幸的是,当我没有指定...

问题描述:

我有一个脚本,其用途如下:

usage: installer.py dir [-h] [-v]

dir是一个位置参数,其定义如下:

parser.add_argument('dir', default=os.getcwd())

我希望dir是可选的:当没有指定时,它应该只是cwd

不幸的是,当我没有指定dir参数时,我得到了Error: Too few arguments


解决方案 1:

使用nargs='?'(或者nargs='*'如果您需要多个目录)

parser.add_argument('dir', nargs='?', default=os.getcwd())

扩展示例:

>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]

positional arguments:
  dir

optional arguments:
  -h, --help  show this help message and exit
  -v

解决方案 2:

作为@VinaySajip 答案的扩展。还有其他nargs值得一提的。

  1. parser.add_argument('dir', nargs=1, default=os.getcwd())

N(整数)。命令行中的 N 个参数将集中到一个列表中

  1. parser.add_argument('dir', nargs='*', default=os.getcwd())

'*'。所有存在的命令行参数都收集到一个列表中。请注意,使用 来放置多个位置参数通常没有什么意义nargs='*',但使用 来放置多个可选参数nargs='*'是可能的。

  1. parser.add_argument('dir', nargs='+', default=os.getcwd())

'+'。与 '*' 一样,所有存在的命令行参数都会被收集到一个列表中。此外,如果不存在至少一个命令行参数,则会生成一条错误消息。

  1. parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())

argparse.REMAINDER. 所有剩余的命令行参数都收集到一个列表中。这对于分派到其他命令行实用程序的命令行实用程序通常很有用

如果nargs未提供关键字参数,则消耗的参数数量由操作决定。通常,这意味着将使用单个命令行参数并生成单个项目(而不是列表)。

编辑(从@Acumenus 的评论中复制) nargs='?' 文档中说:“?”。如果可能,将从命令行使用一个参数并将其生成为单个项目。如果没有命令行参数,则将生成默认值。

解决方案 3:

简短答案

正如前两个答案所示,你可以使用 接受可选的位置参数nargs='?'。你也可以将参数直接转换为Path类型和/或将 cwd 缩短为.

我的文件.py

import argparse
import pathlib

parser = argparse.ArgumentParser()
parser.add_argument("dir", nargs="?", default=".", type=pathlib.Path)
parsed_args = parser.parse_args()

print("Installing to", parsed_args.dir.resolve())
$ python myfile.py
Installing to /users/myname/myfolder

$ python myfile.py /usr/bin/
Installing to /usr/bin

较长的答案

由于您还在问题中提到了标志样式的 True/False 选项,-h因此这些示例可能会有用:-v

旗帜(例如-v

我们可以将不带参数的可选选项称为“标志”。对于标志,我们只关心它们是否被给出。-h是 argparse 自动添加的标志(以及较长的版本--help),因此我们不应该真正覆盖它。如果我们考虑-v

我的文件.py

import argparse

parser = argparse.ArgumentParser()
parser.add_argument(
        "-v",
        "--version",
        action="store_true")
parsed_args = parser.parse_args()

if parsed_args.version:
    print("version flag given")
else:
    print("version flag not given")

请注意,第二个参数add_argument()是选项的较长名称。它不是必需的,但它确实使您的后续代码更具可读性(parsed_args.versionvs parsed_args.v)并使对安装程序的调用更加明确。

$ python myfile.py -v
version flag given

$ python myfile.py --version
version flag given

$ python myfile.py
version flag not given

可选参数(例如--installdir /usr/bin/

有人可能会说,就你的情况而言,使用可选参数而不是位置参数会更好。

我的文件.py

import argparse
import pathlib

parser = argparse.ArgumentParser()
parser.add_argument(
        "-i",
        "--installdir",  # Optional (but recommended) long version
        type=pathlib.Path,
        default="/bin"
        )
parsed_args = parser.parse_args()

print("Installing to", parsed_args.installdir)
$ python myfile.py -i /usr/bin/
Installing to /usr/bin

$ python myfile.py --installdir /usr/bin/
Installing to /usr/bin

$ python myfile.py
Installing to /bin

解决方案 4:

parser.add_argument也有一个开关需要。您可以使用required=False。以下是使用 Python 2.7 的示例代码片段:

parser = argparse.ArgumentParser(description='get dir')
parser.add_argument('--dir', type=str, help='dir', default=os.getcwd(), required=False)
args = parser.parse_args()
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3975  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2742  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   80  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   88  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   77  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用