Python 将多个字符串传递给单个命令行参数

Posted

技术标签:

【中文标题】Python 将多个字符串传递给单个命令行参数【英文标题】:Python pass multiple strings to a single command line argument 【发布时间】:2016-08-10 22:48:22 【问题描述】:

我是 Python 新手,几乎不知道列表和元组。我有一个要执行的程序,它需要几个值作为输入参数。以下是输入参数列表

parser = argparse.ArgumentParser()
parser.add_argument("server")
parser.add_argument("outdir")
parser.add_argument("dir_remove", help="Directory prefix to remove")
parser.add_argument("dir_prefix", help="Directory prefix to prefix")
parser.add_argument("infile", default=[], action="append")
options = parser.parse_args()

程序使用以下命令可以正常工作

python prod2dev.py mysrv results D:\Automations D:\MyProduction Automation_PP_CVM.xml

但是查看代码,似乎代码可以接受多个文件名作为参数“infile”。我尝试过以下传递多个文件名,但都没有成功。

python prod2dev.py mysrv results D:\Automations D:\MyProduction "Automation_PP_CVM.xml, Automation_PT_CVM.xml"

python prod2dev.py mysrv results D:\Automations D:\MyProduction ["Automation_PP_CVM.xml", "Automation_PT_CVM.xml"]

python prod2dev.py mysrv results D:\Automations D:\MyProduction ['Automation_PP_CVM.xml', 'Automation_PT_CVM.xml']

python prod2dev.py mysrv results D:\Automations D:\MyProduction ['"Automation_PP_CVM.xml"', '"Automation_PT_CVM.xml"']

下面的代码显然是在遍历列表

infile = windowsSucksExpandWildcards(options.infile)
 for filename in infile:
    print(filename)
    outfilename = os.path.join(options.outdir, os.path.split(filename)[1])
    if os.path.exists(outfilename):
        raise ValueError("output file exists: ".format(outfilename))

    with open(filename, "rb") as f:
        root = lxml.etree.parse(f)
    if not isEnabled(root):
        print("Disabled. Skipping.")
        continue
    elif not hasEnabledTriggers(root):
        print("Has no triggers")
        continue
...
...
...
def windowsSucksExpandWildcards(infile):
    result = []
    for f in infile:
        tmp = glob.glob(f)
        if bool(tmp):
            result.extend(tmp)
        else:
            result.append(f)
    return result

请指导如何将多个文件名(字符串)传递给显然是一个列表的单个参数“infile”。

我正在运行 Python 3.5.1 |Anaconda 4.0.0(32 位)

【问题讨论】:

【参考方案1】:

您传递的是 nargs 参数,而不是 action="append"

parser.add_argument("infile", default=[], nargs='*')

* 表示零或多个,就像在正则表达式中一样。 如果您至少需要一个,也可以使用+。由于您有默认设置,我假设用户不需要传递任何内容。

【讨论】:

那么调用程序的最佳方式是什么? @Ali:就像你的第一次尝试一样,但没有引号和逗号。引号用于使某个论点不止一个论点。在这种情况下,它们应该是单独的参数。逗号被解释为逗号,而不是分隔符。空格是分隔符。【参考方案2】:

从您发布的所有内容来看,您的代码看起来很可靠。

问题在于您发布的 sn-p 应该遍历列表。您的程序设置方式不能使用 infile 作为变量

修复它所需要做的就是将infileoptions.infile 切换

具体来说:

 for filename in options.infile:
    print(filename)

原因是你的所有参数都存储在选项“命名空间”类型变量中

【讨论】:

我的错。想要隐藏复杂性。请看我的编辑

以上是关于Python 将多个字符串传递给单个命令行参数的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串语句作为命令行参数传递

Java 命令行参数

如何将命令行参数从pytest传递给代码

将命令行参数和文本文件传递给程序

python argh/argparse:如何将列表作为命令行参数传递?

在Linux中利用命令行去传递参数给Python