Python optparse 和参数中的空格

7 投票
5 回答
17347 浏览
提问于 2025-04-16 04:51

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

比如:

python myprog.py --executable python someOtherProg.py

我在'executable'中得到的只是'python'。

请问用optparse能解析这样的行吗,还是必须用argparse才能做到?

补充一下:我已经尝试用引号把它包起来。但在深入研究代码后,我发现子进程调用无法处理这个参数。

命令行的字符串被塞进了一个叫'args'的列表里。

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

就像

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

这样会让我遇到“系统找不到文件”的异常。当我使用

args[0]

时,它能正常工作。但我失去了传给可执行文件的参数。

子进程模块从列表中构建命令行,如果它一开始没有得到字符串,所以我现在无法解释这种行为。

5 个回答

4

你看到的这种行为是因为是你的命令行工具(也就是shell)在解析命令,而不是Python自己在做这件事。命令行工具会把你输入的命令分开,形成一个叫做sys.argv的列表,然后再把这个列表传给Python。

大多数命令行工具会在空格处把这些列表项分开,除非你用引号或者转义符告诉它们不要这样做。

引号的作用就是这样。

在很多命令行工具中,你可以这样做:

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

反斜杠可以让后面的空格不被分开,而不需要用引号。

6

我发现了另一个不错的替代方案 shlex - 这是一个用于简单类Unix命令行语法的词法分析器类。

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

>>> 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"']
13

你可以把它们用引号括起来,这样就能和现有的代码一起工作了。

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

optparse 解析这样的行是否可能,还是必须用 argparse 来做呢?

我不太清楚怎么用 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']

我还建议你从 optparse 切换到 argparse。因为 optparse 从 2.7 版本开始就不再推荐使用了。

撰写回答