如果没有提供某些内容,如何解析Python脚本的参数,以及如何使用默认值

时间:2019-01-30 04:11:03

标签: python python-2.7

我试图通过某些参数传递给终端使我的代码可执行。 我找不到解决类似情况的任何问题或答案。 问题在于,处理参数的顺序也有些含糊。我尝试给出所有选项,但随后它说-p选项需要整数值,并丢弃-p之后立即提供的值。相反,它指向提供的主机名作为失败原因。

当我运行以下命令时,应该执行python脚本: ./Talktoserver -p <portnumber> [hostname] [message]

在这种情况下,如果未提供-p和主机名,则程序应采用默认值。但是必须提供消息。

我尝试使用argparse并尝试封装所有参数并在代码中重用它们,但是它们的顺序完全被弄乱了。

预期结果是,如果用户输入以下任意一项,则代码应执行:

./Talktoserver -p 22 anysite.com Message

./Talktoserver Message

./Talktoserver -p 22 Message

在以下情况下应显示帮助文本: 消息丢失 -p已给出,但没有给出有效的int值。

在所有其他情况下,它应该替换默认值。 (例如,google.com输入主机名,端口号22)

parser.add_argument('-p', metavar='N', type=int, nargs='+', default= 27995,
                 help='Use if you want to specify a custom port number.')
parser.add_argument('hostname', action='store', type = str, default= 'any site.com',
                 help='Use if you want to provide a custom hostname.')
parser.add_argument('message', dest = '', action='store', type = str, required=True,
                 help='Please provide a message')
args = parser.parse_args()
print(args.accumulate(args.integers))

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   # Creating a socket object.
port = parser['num']
hostname = parser['hostname']
message = parser['message']

equ = 'Hello There\n'# Readying the greeting message to be sent to the server.
s.connect((hostname, port))

1 个答案:

答案 0 :(得分:0)

欢迎堆栈溢出:)

以下内容足以满足您的需求。

import argparse

parser = argparse.ArgumentParser(description="")

parser.add_argument(
    "-p",
    metavar="N",
    type=int,
    default=27995,
    help="Use if you want to specify a custom port number.",
)
parser.add_argument(
    "hostname",
    action="store",
    type=str,
    nargs="?",
    default="any site.com",
    help="Use if you want to provide a custom hostname.",
)
parser.add_argument(
    "message",
    action="store",
    type=str,
    help="Please provide a message",
)
args = parser.parse_args()
port = args.p
hostname = args.hostname
message = args.message
print(f"port: {port}, hostname: {hostname}, message: {message}")

现在的帮助文本如下:

usage: Talktoserver [-h] [-p N] [hostname] message

positional arguments:
  hostname    Use if you want to provide a custom hostname.
  message     Please provide a message

optional arguments:
  -h, --help  show this help message and exit
  -p N        Use if you want to specify a custom port number.

如果还没有的话,请查看official argsparse docs,以获取涵盖所有选项的更详细的信息。