你如何使用argparse获取程序的名称?

时间:2014-08-13 23:23:14

标签: python argparse

我使用argparse来解析命令行参数。在浏览argparse的文档时,我只能看到使用不同程序名称的规定。

我希望能够使用默认程序名称,而无需导入sys。根据我的意见,argparse中没有任何内容可以返回程序名称。

import argparse

parser = argparse.ArgumentParser()
args = parser.parse_args()

print(dir(args))

这是输出:

['__class__', '__contains__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_args', '_get_kwargs']

有没有其他方法可以检索程序名称而无需导入sys模块?

3 个答案:

答案 0 :(得分:16)

ArgumentParser个实例具有prog属性,我认为这就是您想要的。

import argparse

parser = argparse.ArgumentParser()
print('parser.prog: {}'.format(parser.prog))

我通过阅读Lib/argparse.py中的模块源代码来发现这一点 - 特别是class ArgumentParser definition。由于属性的名称并不以下划线字符开头,我认为它是公开的。

<强> 更新

我现在至少看到prog实例ArgumentParser属性(或者自问这个问题以来){{3} }和Python 2's documentation

所以,是的,它肯定是公开的,并且在两个版本中,如果在创建ArgumentParser时未将其作为关键字参数提供,则默认为prog = _os.path.basename(_sys.argv[0])(其中{{ 1}}和_os是私有的_sys模块属性,对应于非下划线前缀的对应项。请注意,由于使用argparse,这只是脚本&#39 ; s文件名,而不是可能(它依赖于操作系统)的完整路径os.basename()

答案 1 :(得分:10)

当然正确的方法是:

>>> import sys
>>> print sys.argv[0]
    scripts/script.py

但我们暂时假设您有充分的理由阻止您import sys,但允许您import argparse

martineau在发现prog方面做得非常出色,让我们试一试:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> print parser.prog
    script.py

正如hpaulj所述,它只有文件名而不是sys.argv[0]之类的完整路径,因为模块argparse.py正在使用prog = os.path.basename(sys.argv[0])

argparse必须使用sys,因此需要在argparse命名空间中访问它。我们来检查一下:

>>> import argparse
>>> print argparse.__dict__
    { ..., '_sys': <module 'sys' (built-in)>, ... }

在这里!我们尝试使用_sys

>>> import argparse
>>> print argparse._sys.argv[0]
    scripts/script.py

您正在使用sys!当然,但我没有导入它,只有argparse,这就是问题!

当然这有许多禁忌症:

  • 您不应使用前缀为___其他命名空间的变量,而是使用internally
  • 你不应该依赖其他模块的导入,它们可能会改变。
  • 你不应该依赖无证的api,它们可能会改变。

TL;博士

这很有趣,但只需坚持import sys,直到argparse发布api才能访问sys.argv[0]

答案 2 :(得分:1)

来自%(prog)帮助文本内的

argparse

当您想举一个如何在帮助本身中使用命令的示例时,这是一个常见用例。

main.py

#!/usr/bin/env python3
import argparse
parser = argparse.ArgumentParser(
        description="Do something cool. My name is: %(prog)s",
    epilog="""
This is how you do it:

    %(prog)s yourarg
""",
    formatter_class=argparse.RawTextHelpFormatter
)
parser.add_argument('somearg', help='also works here: %(prog)s')
args = parser.parse_args()

然后:

./main.py -h

给予:

./main.py -h
usage: main.py [-h] somearg

Do something cool. My name is: main.py

positional arguments:
  somearg     also works here: main.py

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

This is how you do it:

    main.py yourarg

sys.argv[0]相比,一个优点是无论您从何处调用该消息,该消息均保持不变。

cd ..
./mydir/main.py

记录在:https://docs.python.org/3/library/argparse.html#prog

  

请注意,程序名称,无论是从sys.argv[0]还是从prog=参数确定,都可用于使用%(prog)s格式说明符的帮助消息。

在Python 3.5.2。上测试