Python拆分CMD字符串遇问题:git log命令执行报错
Python中subprocess使用cmd.split()处理带空格参数的问题
你的问题出在cmd.split()的拆分逻辑上:它只会简单按空格分割字符串,完全不识别引号的作用。
比如这条命令:
cmd = f'git log --all --grep="fixed bug" --pretty="%H|%an"'
用split()拆分后,--grep="fixed和bug"会被当成两个独立的参数传给git,这显然不符合--grep的参数要求,自然会报错。
而你能正常运行的那条命令--pretty=format:"%H|%an|%at",因为引号内部没有空格,split()拆分后参数是完整的,所以git能正确识别。
解决办法
方法1:直接传参数列表(推荐)
subprocess最安全的用法就是直接传入参数列表,这样能精准控制每个参数的边界,完全避免拆分错误:
cmd = [ 'git', 'log', '--all', '--grep=fixed bug', '--pretty=%H|%an' ] process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
注意这里--grep=fixed bug是一个完整的列表元素,git会正确识别这是--grep的参数内容。
方法2:用shlex.split()替代str.split()
如果一定要基于字符串处理,可以用Python标准库的shlex.split(),它会识别引号并正确拆分带空格的参数:
import shlex cmd = f'git log --all --grep="fixed bug" --pretty="%H|%an"' process = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
shlex.split()会把--grep="fixed bug"当成一个完整的参数,不会被空格拆分。
内容的提问来源于stack exchange,提问作者Marriv99
相关产品推荐
相关产品推荐

