Python执行含单引号的Bash命令:转义方法问询
解决Python执行带特殊引号的Shell命令转义问题
这个问题我之前也碰到过,核心就是嵌套引号加上Python和Shell的双层转义搞混了,给你两种靠谱的解决办法,分别对应你用的os.system和subprocess.Popen:
方法1:修复os.system的转义写法
你原来的写法里,文件名ivan's filename.pdf的单引号转义没处理好。推荐用Python的三重双引号来包裹整个命令,这样能避免多层转义的混乱:
import os # 三重双引号里,Shell需要的单引号转义写成\\',Python会解析成传给Shell的\' command = """su -c "lftp -c 'open -u user,password ftp://127.0.0.1; get ivan\\'s filename.pdf'" someuser""" os.system(command)
原理很简单:Python的三重引号会保留内部的格式,\\'在Python里会被解析成单个\',传到Shell后,Shell就会把\'识别为文件名里的单引号,完美解决嵌套问题。
方法2:用subprocess.Popen更安全的写法
subprocess推荐用列表形式传参来避免Shell转义坑,不过因为su -c需要接收一个完整的命令字符串,我们可以换个思路——给文件名套双引号,这样就不用转义单引号了:
import subprocess # 把带单引号的文件名用双引号包裹,Shell直接就能识别 subprocess.Popen([ "su", "-c", "lftp -c 'open -u user,password ftp://127.0.0.1; get \"ivan's filename.pdf\"'", "someuser" ])
如果觉得双引号嵌套看着乱,也可以用Python的原始字符串(r"")来简化:
# 原始字符串里不需要转义反斜杠,直接写\'就行 command_str = r"lftp -c 'open -u user,password ftp://127.0.0.1; get ivan\'s filename.pdf'" subprocess.Popen(["su", "-c", command_str, "someuser"])
额外小技巧
其实最稳妥的是尽量避免嵌套单引号,比如在Shell命令里用双引号包裹带特殊字符的文件名,这样不管是Python还是Shell都不用复杂转义,可读性也更高。
内容的提问来源于stack exchange,提问作者idiaz01
相关产品推荐
相关产品推荐

