如何通过Python subprocess.run传递含括号参数至AWS ECS execute-command
使用subprocess.run调用AWS CLI在ECS容器内执行命令的语法错误解决
目标
使用subprocess.run调用AWS CLI,在运行中的ECS任务容器内执行命令。
问题重现
尝试两种方式传递含特殊字符的参数,均触发语法错误:
import json import subprocess task_arn = 'a_task_arn' arg = {'something': 'that contains ( )'} # 尝试1:直接序列化JSON字符串 arg = json.dumps(arg) subprocess_cmd = 'aws ecs execute-command --command "python -m task.function {arg}" --interactive --task {task_arn} --container Container' subprocess.run(subprocess_cmd, shell=True) # 注:原代码缺少闭合括号 # 尝试2:编码为UTF-8字节串 arg = json.dumps(arg).encode('utf-8') subprocess_cmd = 'aws ecs execute-command --command "python -m task.function {arg}" --interactive --task {task_arn} --container Container' subprocess.run(subprocess_cmd, shell=True) # 注:原代码缺少闭合括号
错误信息
/bin/sh: 1: Syntax error: "(" unexpected
弃用boto3 execute_command的原因
- boto3返回的WebSocket没有便捷的读取方式
- boto3仅能返回WebSocket消息的极小部分,无法获取完整命令输出
解决方案
问题核心是shell=True时,shell会解析参数中的特殊字符(如括号)导致语法错误。推荐两种解决方式:
方式1:不使用shell模式(推荐)
将命令拆分为列表传递,Python会自动处理参数转义,避免shell解析问题:
import json import subprocess task_arn = 'a_task_arn' arg = {'something': 'that contains ( )'} arg_json = json.dumps(arg) # 拆分命令为参数列表 subprocess_cmd = [ 'aws', 'ecs', 'execute-command', '--command', f'python -m task.function {arg_json}', '--interactive', '--task', task_arn, '--container', 'Container' ] # 禁用shell模式 subprocess.run(subprocess_cmd, check=True)
方式2:使用shell模式时转义特殊字符
如果必须使用shell=True,需用shlex.quote()对含特殊字符的参数进行转义:
import json import subprocess import shlex task_arn = 'a_task_arn' arg = {'something': 'that contains ( )'} arg_json = json.dumps(arg) # 对JSON字符串进行shell安全转义 escaped_arg = shlex.quote(arg_json) subprocess_cmd = f'aws ecs execute-command --command "python -m task.function {escaped_arg}" --interactive --task {task_arn} --container Container' subprocess.run(subprocess_cmd, shell=True, check=True)
内容的提问来源于stack exchange,提问作者Cogito Ergo Sum
相关产品推荐
相关产品推荐

