Flask中使用subprocess.Popen传递字典参数的实现方案问询
解决Flask中subprocess传递字典参数的问题
这个问题我之前也碰到过,subprocess.Popen确实只接受字符串类型的命令参数,直接把字典拼进去肯定会触发类型错误,下面给你几个可行的解决方案:
方法1:将字典序列化为JSON字符串传递
把字典转成JSON格式的字符串(标准的字符串格式),在目标脚本里再解析回字典,这是跨进程传递复杂数据的常用方式。
主脚本代码:
import json import subprocess import shlex myDict = {1:"a",2:"b"} value1 = "data" value2 = "data1" # 将字典转为JSON字符串 dict_json = json.dumps(myDict) # 用shlex.quote处理字符串,避免特殊字符导致bash命令拆分出错 safe_dict_str = shlex.quote(dict_json) # 拼接bash命令 bashCommand = f"python script.py {value1} {value2} {safe_dict_str}" process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = process.communicate()
目标脚本(script.py)代码:
import sys import json # 接收参数并解析回字典 value1 = sys.argv[1] value2 = sys.argv[2] myDict = json.loads(sys.argv[3]) # 后续处理逻辑 print(f"Received: {value1}, {value2}, {myDict}")
方法2:直接传递参数列表(更安全推荐)
不用拼接bash命令字符串,直接给subprocess.Popen传参数列表,subprocess会自动处理参数分隔,避免shell注入风险,也不用手动处理引号:
主脚本代码:
import json import subprocess myDict = {1:"a",2:"b"} value1 = "data" value2 = "data1" dict_json = json.dumps(myDict) # 直接传递参数列表,无需split process = subprocess.Popen( ["python", "script.py", value1, value2, dict_json], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) output, error = process.communicate()
目标脚本的解析代码和方法1完全一致。
方法3:直接导入Python函数调用(最高效推荐)
既然是Python调用另一个Python脚本,完全没必要通过subprocess启动新进程,直接导入目标脚本的函数,直接传递字典参数即可,既高效又不用处理序列化:
目标脚本(script.py)代码:
def process_data(value1, value2, my_dict): # 这里写你的业务逻辑 print(f"Processing: {value1}, {value2}, {my_dict}") return "处理完成" # 保留命令行调用的入口,兼容两种方式 if __name__ == "__main__": import sys import json result = process_data(sys.argv[1], sys.argv[2], json.loads(sys.argv[3])) print(result)
主脚本代码:
import script myDict = {1:"a",2:"b"} value1 = "data" value2 = "data1" # 直接调用函数,字典可以直接传递 result = script.process_data(value1, value2, myDict) print(result)
我个人优先推荐方法3,因为没有进程间通信的开销,代码更简洁;如果必须用subprocess的话,方法2比方法1更安全,能避免很多潜在的命令注入问题。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

