You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:13:44