6

使用 optparse 时,我想在一个选项之后获取整个字符串,但我只得到它的一部分,直到第一个空格。

例如:

python myprog.py --executable python someOtherProg.py

我在“可执行文件”中得到的只是“python”。

是否可以使用 optparse 解析这些行,还是必须使用 argparse 来解析?

€:我已经尝试将它包含在 "s 中。但是在深入研究代码后,我发现子进程调用无法处理参数。

带有命令行的字符串被塞进一个列表“args”中。

args = [self.getExecutable()] + self.getArgs().split()

就像是

"[python D:\\\workspace\\\myprog\\\src\\\myprog.py]"

这给了我系统找不到文件异常。当我使用

args[0]

有用。但是我放弃了可执行文件的论点。

如果 subprocess 模块一开始没有得到字符串,它会从列表中构建一个 cmdline,所以我目前无法解释这种行为。

4

5 回答 5

12

您可以将它们括在引号中,以使它们与现有代码一起使用。

python myprog.py --executable "python someOtherProg.py"

是否可以使用 optparse 解析这些行,还是必须使用 argparse 来解析?

我不知道您是否/如何做到这一点,optparse因为我还没有真正使用过optparse.

但是,我可以帮助您解决问题argparse。这是一个简单的例子:

#!/usr/bin/python
import argparse, sys

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Demonstration of Argparse.')
    parser.add_argument('-e', '--executable', nargs = '+', help = 'List of executables')
    args = parser.parse_args(sys.argv[1:])
    print args.executable

和用法:

manoj@maruti:~$ python myprog.py --executable python someOtherProg.py
['python', 'someOtherProg.py']

我还建议从 切换optparseargparse. 自 2.7 起Optparse弃用。

于 2010-10-01T13:54:45.873 回答
6

我找到了另一个不错的选择shlex- 用于简单的类似 shell 的语法的词法分析器类。

源链接:如何用正则表达式解析命令行?

>>> import shlex
>>> shlex.split('"param 1" param2 "param 3"')
['param 1', 'param2', 'param 3']
>>> shlex.split('"param 1" param2 "param 3"')
Traceback (most recent call last):
    [...]
ValueError: No closing quotation
>>> shlex.split('"param 1" param2 "param 3\\""')
['param 1', 'param2', 'param 3"']
于 2011-08-31T08:54:06.937 回答
4

您看到的行为来自这样一个事实,即解析命令行并将其分成 sys.argv 的单词的是您的 shell,而不是 python。Python 由 shell 通过 exec() 启动,argv 已经填充。

大多数 shell 会在空格处拆分 argv 项目,除非您通过引用或转义告诉它们不要这样做。

报价工作如上所述。

在许多 shell 中,您可以这样做:

python myprog.py --executable python\ someOtherProg.py

反斜杠在不需要引号的情况下转义以下空格。

于 2010-10-01T14:01:09.097 回答
4

如果您知道要获得的参数标志后有多少个单词,则可以修改在 in 中创建--executable选项的方式optparse以正确处理这种情况:

您可以将解析器设置为查找两个(或更多)单词,而不是在选项标志之后使用单个单词:optparse

from optparse import OptionParser
parser = OptionParser()

parser.add_option("-f", "--file", action="store", dest="filename",
                       help="File to be processed.", metavar="FILE")
parser.add_option("-e", "--executable", action="store", dest="my_exe",
                       help="Command to be executed", metavar="EXE",
                       nargs=2)

在此代码段中,-for--file选项只需要一个单词并将其作为字符串(默认值)存储在filename变量中。

相比之下,-e,--executable选项由于该选项而需要两个单词nargs=2。这将导致在-eor--executable标志后面找到的两个单词作为字符串存储在 Python 列表中my_exe

查看:http ://docs.python.org/library/optparse.html了解更多信息optparse,并记住它已被弃用,从 2.7 开始支持argparse.

于 2010-10-03T15:57:47.003 回答
1

如果您无法升级到 argparse,则只是为了最终确定此答案列表。

Optparse 无法处理这些情况(多个字符串)。您只能使用 nargs 来指定特定数量的变量,但没有像“一个或多个”这样的东西。您需要破解它或使用不同的库(例如 argparse 或其他)。

于 2011-07-26T10:36:48.590 回答