当使用optparse时,我希望在选项后得到整个字符串,但我只能将它的一部分放到第一个空格中。
e.g:
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]
它有效。但我放弃了可执行文件的参数。
如果第一个地方没有得到字符串,则子进程模块会从列表构建cmdline,所以我暂时无法解释这种行为。
答案 0 :(得分: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']
我还建议从optparse
切换到argparse
。自2.7以来,Optparse
为deprecated。
答案 1 :(得分:6)
我找到了另一个很好的替代方法shlex
- 一个词法分析器类,用于简单的类似shell的语法。
来源链接:How to parse a command line with regular expressions?
>>> 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"']
答案 2 :(得分:4)
你看到的行为来自这样一个事实:它是你的shell,而不是python,它解析命令行并将其分成sys.argv的单词。 Python由shell通过exec()启动,argv已经填充。
大多数shell会在空格中拆分argv项目,除非你告诉他们不要引用或转义。
报价按上述方式工作。
在许多炮弹中你可以这样做:
python myprog.py --executable python\ someOtherProg.py
反斜杠会在不需要引号的情况下转义以下空格。
答案 3 :(得分:4)
如果您知道要获得的参数标记后面有多少个单词,您可以修改--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)
在此代码段中,-f
或--file
选项只需要一个单词,并将其作为字符串(默认值)存储在filename
变量中。
相比之下,-e
,--executable
选项需要两个单词,因为nargs=2
选项。这将导致在-e
或--executable
标志后面找到的两个单词作为字符串存储在Python列表my_exe
中。
有关optparse
的更多信息,请查看http://docs.python.org/library/optparse.html,并记住它自2.7以来已被弃用,赞成argparse
。
答案 4 :(得分:1)
如果您无法升级到argparse,请完成此答案列表。
Optparse无法处理这些情况(多个字符串)。你只能使用nargs来指定特定数量的valiables,但没有什么比“一个或多个”更好。您需要破解或使用不同的库(例如argparse或其他)。