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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:22:51