【问题标题】:parse command line arguments not reading all arguments?解析命令行参数不读取所有参数?
【发布时间】:2012-09-18 18:03:52
【问题描述】:

所以,我遇到了 getopt module 来解析命令行参数,尽管我无法理解这些文档。 无论出于何种原因,我无法弄清楚为什么这没有看到我的 --domain example.com 论点..

$ ./httpdsetup.py -a -u zack --domain example.com
[('-a', ''), ('-u', '')]

我打印出了转储到 opts 的内容,看看它看到了什么。下面的代码与文档站点几乎完全相同。

def main(argv):
        import getopt

        try:
                opts, args = getopt.getopt(argv, "h:al:ud:v", ["user=", "apache", "lighttpd", "dir=", "domain=", "vhost="])
        except getopt.GetoptError:
                print_usage()
                sys.exit(2)

        username = ''
        directory = ''
        domain = ''

        httpd = 'apache'

        print(opts)

        for opt, arg in opts:
                if opt == '-h':
                        print_usage()
                        sys.exit()
                elif opt in ('-u', '--username'):
                        username = arg
                elif opt in ('-d', '--dir'):
                        directory = arg
                elif opt in ('-v', '--domain', '--vhost'):
                        domain = arg
                elif opt in ('-a', '--apache'):
                        httpd = 'apache'
                elif opt in ('-l', '--lighttpd'):
                        httpd = 'lighttpd'
                else:
                        print_usage()
                        sys.exit()

        if httpd == 'apache':
                create_apache_vhost(domain, directory, username)
        elif httpd == 'lighttpd':
                create_lighty_vhost(domain, directory, username)

if __name__ == '__main__':
        main(sys.argv[1:])

【问题讨论】:

  • 不要使用getopt,使用argparse。它更灵活,IMO 界面更清晰。
  • 碰巧,你知道 Debian 软件包吗?
  • 我在导入模块 'argparse' 时遇到 ImportError,尽管在 Debian Squeeze 上安装了“python-argparse”包。
  • argparse 应该内置在 Python 3.2 中。
  • argparse 不在 Py =3.2 中。如果您无法在安装中使用它,只需将the single file from python 3.2 复制到您的脚本旁边即可。我也更喜欢 argparse 而不是 getopt。

标签: python python-3.x getopt command-line-arguments


【解决方案1】:

我更喜欢argparsePython documention here。 它在 Python >=2.7 和 >=3.2 中,但不在 Python 3.0 和 3.1 中。如果您的安装中缺少它,只需将 the single file from here 复制到您的脚本所在的位置,或者复制到您的 Python 安装中。

这是与argparse 的示例相近的内容:

#!/usr/bin/env python3

import sys



def create_apache_vhost(*args, **kwargs):
    pass

def create_lighty_vhost(*args, **kwargs):
    pass

def main(argv):
        import argparse

        parser = argparse.ArgumentParser(description="Some server",
                                         formatter_class=argparse.RawDescriptionHelpFormatter)

        parser.add_argument('--username', type=str)
        parser.add_argument('-u', dest='username', type=str)

        parser.add_argument('--apache', dest='httpd', action='store_const', const='apache')
        parser.add_argument('-a',       dest='httpd', action='store_const', const='apache')
        parser.add_argument('--lighthttpd', dest='httpd', action='store_const', const='lighthttpd')
        parser.add_argument('-l',           dest='httpd', action='store_const', const='lighthttpd')

        parser.add_argument('--domain', type=str)
        parser.add_argument('--vhost',  type=str)
        parser.add_argument('-v', dest='domain', type=str)

        parser.add_argument('--dir', dest='directory', type=str)
        parser.add_argument('-d', dest='directory', type=str)

        defaults = {
            'httpd': 'apache',
            }
        parser.set_defaults(**defaults)

        args = parser.parse_args(args=argv)

        print(args)

        if args.httpd == 'apache':
                create_apache_vhost(args.domain, args.directory, args.username)
        elif args.httpd == 'lighttpd':
                create_lighty_vhost(args.domain, args.directory, args.username)

if __name__ == '__main__':
        main(sys.argv[1:])

【讨论】:

  • 谢谢!虽然,我对 Python 还是很陌生。 **kwargs(和其他星号变量)是指针数组吗? o.O 我对 C++ 的理解很模糊,因为我自己主要是 C# 开发人员。
  • 附注,我似乎在 Debian Squeeze 上找不到用于 argparse 的工作包(不提供 ImportError 的包)。
  • Python 中的一切都是引用,所以没有指针。 *args**kwargs 与 C 的 varargs 相似,因为它们包含可选参数。一个* 是位置参数,两个** 是命名参数。
  • 对于您的 argparse 错误,恐怕您必须提供错误消息并转到新问题或论坛。 cmets 的空间和上下文只有这么多
猜你喜欢
  • 2013-03-21
  • 2023-04-01
  • 2012-01-26
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多