Python optparse 和参数中的空格
在使用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 版本开始就不再推荐使用了。