Python 如果没有位置参数,是否打印帮助?

Python 如果没有位置参数,是否打印帮助?,python,argparse,Python,Argparse,我正在制作一个非常简单的脚本,其中包含以下参数: -p --port integer, optional, default 5050 -f --fork boolean, optional, default False action string, required, needs to be either start or stop 我已经尝试在argparse中实现了这一点,但当没有提供操作字符串时,它不会打印帮助,它只是失败了,比如: usage: __init__.py [-h] [-p

我正在制作一个非常简单的脚本,其中包含以下参数:

-p --port integer, optional, default 5050
-f --fork boolean, optional, default False
action string, required, needs to be either start or stop
我已经尝试在argparse中实现了这一点,但当没有提供操作字符串时,它不会打印帮助,它只是失败了,比如:

usage: __init__.py [-h] [-p PORT] [-f] {start,stop}
__init__.py: error: argument action: invalid choice: '__init__.py' (choose from 'start', 'stop')
即使我通过“开始”或“停止”,它也会失败,并显示相同的消息。这是我的密码:

parser = argparse.ArgumentParser(description="Start or stop the server.",
    epilog="If you don't know what you're doing, run. Run for your life.\n")
parser.add_argument("-p", "--port", type=int, nargs=1, default=5050,
    dest="port", help="The port to run the server on.")
parser.add_argument("-f", "--fork", action="store_true", default=False,
    dest="fork", help="Fork to background? Default is false.")
parser.add_argument("action", type=str, choices=("start","stop"), help="Whether to 'start' or 'stop' the server.")

我做错了什么?希望我的意图从我的代码中非常清楚

当提供无效参数时,设计用于打印使用情况消息和问题描述,然后退出,这正是示例中发生的情况

如果你想让它打印一条帮助信息,你需要自己处理这个问题。例如,如果未提供任何操作,此代码将打印帮助消息:

parser = argparse.ArgumentParser(description="Start or stop the server.",
    epilog="If you don't know what you're doing, run. Run for your life.\n",
    prog="myserver")
parser.add_argument("-p", "--port", type=int, nargs=1, default=5050,
    dest="port", help="The port to run the server on.")
parser.add_argument("-f", "--fork", action="store_true", default=False,
    dest="fork", help="Fork to background? Default is false.")
parser.add_argument("action", nargs="?", type=str, choices=("start","stop"),
    help="Whether to 'start' or 'stop' the server.")

args = parser.parse_args()
if args.action is None:
    parser.print_help()
    sys.exit(1)
如果我在不执行任何操作的情况下运行此操作,我会得到:

$ python s.py
usage: myserver [-h] [-p PORT] [-f] [{start,stop}]

Start or stop the server.

positional arguments:
  {start,stop}          Whether to 'start' or 'stop' the server.

optional arguments:
  -h, --help            show this help message and exit
  -p PORT, --port PORT  The port to run the server on.
  -f, --fork            Fork to background? Default is false.

If you don't know what you're doing, run. Run for your life.
但是,如果使用无效操作或无效参数运行此操作,则它将恢复为argparse模块的预期行为:

 $ python s.py not_valid
usage: myserver [-h] [-p PORT] [-f] [{start,stop}]
myserver: error: argument action: invalid choice: 'not_valid' (choose from 'start', 'stop')

您使用的是什么版本的Python?当我用2.7.1运行你的代码时,它运行得很好

$ ./t stop
$ ./t start
$ ./t -f start
$ ./t -f stop
$ ./t -f
usage: someprog [-h] [-p PORT] [-f] {start,stop}
someprog: error: too few arguments
$ ./t -f -p 8080
usage: someprog [-h] [-p PORT] [-f] {start,stop}
someprog: error: too few arguments
$ ./t -f -p 8080 start
有一个提示,如果在ctor中指定“prog”,可以使用init.py作为文件名覆盖它

parser = argparse.ArgumentParser(
    prog="someprog",
    description="Start or stop the server.",
    epilog="If you don't know what you're doing, run. Run for your life.\n"
)
此外,这是打印使用,但不是长期的帮助。。你可以这样做,让事情变得更加明显

try:
    parser.parse_args()
except Exception e:
    print "************************"
    parser.print_help()
    print "************************"

您如何调用
\uuuu init\uuuuuuy.py
?不知何故,
\uuuu init.py\uuuu
被作为第一个参数提供,就好像您在调用
python\uuuu init\uuuuu.py
一样。您如何调用
parser.parse\u args()
?如果我说
parser.parse_args(['start'])
,我会返回一个
名称空间
对象。糟糕的是,我传递的是
sys.argv
,而不是
sys.argv[1:://code>。当它以无效操作或无效参数运行时,是否可以打印帮助?