Python 如何将表示Bash命令元素的列表元素组合到具有equals符号的新列表中
我的清单如下:Python 如何将表示Bash命令元素的列表元素组合到具有equals符号的新列表中,python,list,command,arguments,equals,Python,List,Command,Arguments,Equals,我的清单如下: commandOptionsAndArguments = ['myBigTool', '--num-callers', '30', '--leak-check', 'full', '--tool', 'memcheck', '--suppressions', 'etc/valgrind-root.supp', '--suppressions', 'Gaudi.supp/Gaudi.supp', '--suppressions', 'oracleDB.supp', '--suppr
commandOptionsAndArguments = ['myBigTool', '--num-callers', '30', '--leak-check', 'full', '--tool', 'memcheck', '--suppressions', 'etc/valgrind-root.supp', '--suppressions', 'Gaudi.supp/Gaudi.supp', '--suppressions', 'oracleDB.supp', '--suppressions', 'valgrindRTT.supp', '--suppressions', 'root.supp/root.supp', '--mySpecialFlag', '$(which python)', '$(which athena.py)', 'athenaConf.pkl']
此列表由Bash命令的元素组成,该命令具有选项,如果有选项,还包括各自的参数。我想将其转换为以下列表:
commandOptions = ['myBigTool', '--num-callers=30', '--leak-check=full', '--tool=memcheck', '--suppressions=etc/valgrind-root.supp', '--suppressions=Gaudi.supp/Gaudi.supp', '--suppressions=oracleDB.supp', '--suppressions=valgrindRTT.supp', '--suppressions=root.supp/root.supp', '--mySpecialFlag', '$(which python)', '$(which athena.py)', 'athenaConf.pkl']
这个新列表包含选项,如果它们有选项,则使用等号将它们各自的参数组合成新元素。下一步是使用子流程执行此命令,或者将其转换为字符串以与操作系统一起使用:
" ".join(commandOptions)
# 'myBigTool --num-callers=30 --leak-check=full --tool=memcheck --suppressions=etc/valgrind-root.supp --suppressions=Gaudi.supp/Gaudi.supp --suppressions=oracleDB.supp --suppressions=valgrindRTT.supp --suppressions=root.supp/root.supp --mySpecialFlag $(which python) $(which athena.py) athenaConf.pkl'
我的问题是:如何将列表commandOptions和arguments
以健壮的方式更改为列表commandOptions
,并适当地检测带参数和不带参数的两个选项
(另外,如果有人对所提到的列表有更好的名字,请随意推荐。我不确定应该用什么词来描述使用等号来指定命令选项的参数,而不是使用空格。)您可以使用切片:
>>> [commandOptionsAndArguments[0]]+['='.join(commandOptionsAndArguments[1:][i:i+2]) for i in range(0,len(commandOptionsAndArguments)-1,2)]
['myBigTool', '--num-callers=30', '--leak-check=full', '--tool=memcheck', '--suppressions=etc/valgrind-root.supp', '--suppressions=Gaudi.supp/Gaudi.supp', '--suppressions=oracleDB.supp', '--suppressions=valgrindRTT.supp', '--suppressions=root.supp/root.supp', '--mySpecialFlag=$(which python)', '$(which athena.py)=athenaConf.pkl']
>>>
您可以在这里使用
re
模块
>>> commandOptionsAndArguments = ['myBigTool', '--num-callers', '30', '--leak-check', 'full', '--tool', 'memcheck', '--suppressions', 'etc/valgrind-root.supp', '--suppressions', 'Gaudi.supp/Gaudi.supp', '--suppressions', 'oracleDB.supp', '--suppressions', 'valgrindRTT.supp', '--suppressions', 'root.supp/root.supp', '--mySpecialFlag', '$(which python)', '$(which athena.py)', 'athenaConf.pkl']
>>> re.split(r'\s+(?![^()]*\))', re.sub(r'(--\S+)\s+(\w\S+)', r'\1=\2', ' '.join(commandOptionsAndArguments)))
['myBigTool', '--num-callers=30', '--leak-check=full', '--tool=memcheck', '--suppressions=etc/valgrind-root.supp', '--suppressions=Gaudi.supp/Gaudi.supp', '--suppressions=oracleDB.supp', '--suppressions=valgrindRTT.supp', '--suppressions=root.supp/root.supp', '--mySpecialFlag', '$(which python)', '$(which athena.py)', 'athenaConf.pkl']
说明:
使用空格作为分隔符连接给定列表中的所有元素'.join(commandoptions和arguments)
- 这将替换以
开头的单词和以--
符号开头的单词(以单词字符开头)之间的=中存在的空格。这样它就不会替换=
和--mySpecialFlag
之间的空格$(哪个python)
- 最后,这个
匹配一个或多个不在r'\s+(?![^()]*\)”
括号内的空格。通过根据匹配的空格拆分结果字符串,将获得所需的输出()
--mySpecialFlag
。接下来,您可以看到有一个程序,可执行文件myBigTool
(Valgrind的占位符)在该程序上运行。@d3pd不客气!很遗憾,我错过了你的编辑!但很高兴你找到了解决方案!哇,那是怎么回事?最后,它是如何处理这个笨拙的无参数标志选项的?非常感谢您对它如何工作的解释,特别是对正则表达式的关注。我真的要熟悉它。。。
re.sub(r'(--\S+)\s+(\w\S+)', r'\1=\2', ' '.join(commandOptionsAndArguments))