我使用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
模块?
答案 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。这很有趣,但只需坚持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。上测试