终端命令转义问题

时间:2017-02-05 15:32:02

标签: python escaping

我试图逃避以下内容,因此我可以通过USB获取附加的iDevice版本:

system_profiler SPUSBDataType | sed -n -e 's/ */ /g' -e '/iPad/,/Version/p' -e '/iPhone/,/Version/p' | grep 'iPad\|iPhone\|Version' | awk 'NR%2{printf $0;next;}1'

所以我可以通过Popen运行它,但每次我总是在iPad\|iPhone\|Version上遇到问题时,我的代码如下,试图逃避单引号:

cmd1 = Popen([r'system_profiler', 'SPUSBDataType'], stdout=subprocess.PIPE)
cmd2 = Popen([r'sed','-n','-e','\'s/  */ /g\'','-e','\'/iPad/,/Version/p\'', '-e', '\'/iPhone/,/Version/p\''], stdin=cmd1.stdout, stdout=subprocess.PIPE)
cmd3 = Popen([r'grep', '\'iPad\|iPhone\|Version\''], stdin=cmd2.stdout, stdout=subprocess.PIPE)
cmd4 = Popen([r'awk', '\'NR%2{printf $0;next;}1\''], stdin=cmd3.stdout, stdout=subprocess.PIPE)
cmd1.stdout.close() 
ver = cmd4.communicate()[0]

2 个答案:

答案 0 :(得分:1)

使用原始字符串文字,或加倍反斜杠; \|在Python字符串定义语法中也有含义 too ,导致结果值中不存在反斜杠。你也不需要那些引号(shell也会删除它们):

cmd3 = Popen([r'grep', r"iPad\|iPhone\|Version"], stdin=cmd2.stdout, stdout=subprocess.PIPE)

在我看来,在Python代码中应用字符串过滤和替换要容易得多。

答案 1 :(得分:0)

与grep一起玩,并设法从system_profiler中提取我需要的东西。但是,如果你不能找到必要的字符串,Martijn的答案会更合适。

 prof = Popen(['system_profiler', 'SPUSBDataType'], stdout=subprocess.PIPE)
 grep1 = Popen(['grep','-e','iPhone','-e','iPad','-e','iPod', '-A', '4'], stdin=prof.stdout, stdout=subprocess.PIPE)
 grep2 = Popen(['grep', 'Version'], stdin=grep1.stdout, stdout=subprocess.PIPE)
 prof.stdout.close()  # Allow ps_process to receive a SIGPIPE if grep_process exits.
 stdoutver = grep2.communicate()[0]