Python中subprocess.call执行shell命令时如何处理转义字符?

上面主要是想去掉^A 前的.但是却失败了。 shell 中直接执行 sed -i 's/\^A/^A/g' test.txt 就能成功了

感觉应该是表达式出了问题,可是引用 re 貌似也没效果,请教一下这个的正确写法。

           from subprocess import call
           import re
           fp = 'test.txt'
           call(["sed","-i","s/\\\^A/\^A/g",fp]) #ctrl+v,a
           call(["sed","-i",r"s/\\\^A/\^A/g",fp])

或者不用 sed,用 python 能替换掉也好。


Python中subprocess.call执行shell命令时如何处理转义字符?

3 回复

在Python的subprocess.call里处理shell命令的转义字符,关键在于正确使用参数传递方式。

核心要点:

  • 使用列表形式传递参数,让Python自动处理转义
  • 避免使用字符串形式通过shell执行,除非确实需要shell特性

正确做法示例:

import subprocess

# 错误方式:使用字符串通过shell执行,容易出转义问题
# subprocess.call('ls -l *.txt', shell=True)  # 不推荐

# 正确方式1:使用列表参数,不需要shell=True
subprocess.call(['ls', '-l', '*.txt'])

# 正确方式2:处理带特殊字符的文件名
filename = "file with spaces.txt"
subprocess.call(['cat', filename])  # Python会自动处理

# 正确方式3:需要环境变量时
import os
env = os.environ.copy()
env['MY_VAR'] = 'some value'
subprocess.call(['echo', '$MY_VAR'], env=env)

如果必须使用shell=True(比如需要管道、通配符等shell特性):

# 使用shlex.quote来安全转义
import shlex
import subprocess

command = 'echo ' + shlex.quote('特殊字符&|<>')
subprocess.call(command, shell=True)

简单总结: 优先用列表传参,必须用shell时记得用shlex.quote。


Python 字符串有反斜槓的話,直接在字符串前加 r 吧

回到顶部