Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将表示Bash命令元素的列表元素组合到具有equals符号的新列表中_Python_List_Command_Arguments_Equals - Fatal编程技术网

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+(?![^()]*\)”
    匹配一个或多个不在
    ()
    括号内的空格。通过根据匹配的空格拆分结果字符串,将获得所需的输出


您希望如何在say--suppressions和--mySpecialFlag之间做出区别?基于格式(破折号分隔vs CamelCase)?是的,这是一个问题,我正在寻找相关建议。你能建议一个合理的方法吗?我看不到任何简单和优雅的东西,这可能取决于你如何建立这个列表,或者你能改变多少。非常感谢你的建议。您将切片与列表理解相结合的方法非常有效,但它无法处理没有参数的选项。我添加的没有参数的示例选项是
--mySpecialFlag
。接下来,您可以看到有一个程序,可执行文件
myBigTool
(Valgrind的占位符)在该程序上运行。@d3pd不客气!很遗憾,我错过了你的编辑!但很高兴你找到了解决方案!哇,那是怎么回事?最后,它是如何处理这个笨拙的无参数标志选项的?非常感谢您对它如何工作的解释,特别是对正则表达式的关注。我真的要熟悉它。。。
re.sub(r'(--\S+)\s+(\w\S+)', r'\1=\2', ' '.join(commandOptionsAndArguments))