如何用Python遍历键值对并调用外部脚本传递参数?
理想实现方案:遍历键值对并调用外部Python脚本
一、输入文件格式选哪种?
- 能改格式的话,优先用JSON,Python原生就支持解析,不用自己写字符串分割逻辑,避免格式不统一踩坑。比如把INPUTLIST.txt改成INPUTLIST.json,要么存成字典:
{"KV1":123, "KV2":456},要么存成列表:[{"key":"KV1", "value":123}, {"key":"KV2", "value":456}] - 要是必须保留每行
键:值的文本格式,也能处理,但得保证每行格式统一(别一会儿冒号前有空格,一会儿没有)
二、核心实现逻辑
用Python的subprocess模块调用main_script.py,这比os.system好用太多——能捕获脚本输出、处理返回码,稳定性拉满。
三、具体代码示例
1. 处理每行键:值格式的文本文件
import subprocess # 读取文件,跳过空行 with open("INPUTLIST.txt", "r", encoding="utf-8") as f: lines = [line.strip() for line in f if line.strip()] # 逐个处理键值对 for line in lines: # 分割键和值,maxsplit=1避免值里有冒号的情况 key, value = line.split(":", maxsplit=1) key = key.strip() value = value.strip() # 调用main_script.py,传两个参数:key和value result = subprocess.run( ["python", "main_script.py", key, value], capture_output=True, text=True, encoding="utf-8" ) # 可选:打印处理结果,方便排查问题 print(f"处理 {key}:{value} 结束") if result.returncode == 0: print(f"脚本输出:{result.stdout}") else: print(f"脚本出错了:{result.stderr}")
2. 处理JSON字典格式(推荐)
假设INPUTLIST.json内容是:
{ "KV1": "123", "KV2": 456, "KV3": "abc" }
代码实现:
import subprocess import json # 加载JSON字典 with open("INPUTLIST.json", "r", encoding="utf-8") as f: kv_dict = json.load(f) # 遍历键值对 for key, value in kv_dict.items(): # 把值转成字符串,因为subprocess参数必须是字符串 value_str = str(value) # 调用脚本 result = subprocess.run( ["python", "main_script.py", key, value_str], capture_output=True, text=True, encoding="utf-8" ) # 处理结果 print(f"处理 {key}:{value} 结束") if result.returncode != 0: print(f"错误信息:{result.stderr}")
3. 处理JSON列表格式
如果INPUTLIST.json是列表结构:
[ {"key": "KV1", "value": 123}, {"key": "KV2", "value": "456"} ]
代码:
import subprocess import json with open("INPUTLIST.json", "r", encoding="utf-8") as f: kv_list = json.load(f) for item in kv_list: key = item["key"] value_str = str(item["value"]) result = subprocess.run( ["python", "main_script.py", key, value_str], capture_output=True, text=True, encoding="utf-8" ) print(f"处理 {key}:{item['value']} 结束")
四、几个要注意的点
- 得确保
main_script.py能正确接收命令行参数,比如用sys.argv获取:# main_script.py示例代码 import sys if __name__ == "__main__": if len(sys.argv) != 3: print("请传入两个参数:key 和 value") sys.exit(1) key = sys.argv[1] value = sys.argv[2] # 这里写你的业务逻辑 print(f"收到参数:key={key}, value={value}") - 如果
main_script.py不在当前文件夹,要写全路径,比如"/home/user/scripts/main_script.py" - 要是想提速,可以用多线程/多进程并行处理,但得确认你的脚本支持并行,别搞出资源冲突
- 遇到键或值带空格、引号的情况,
subprocess.run会自动转义,不用手动加引号,比直接拼命令字符串安全多了
内容的提问来源于stack exchange,提问作者hitman126
相关产品推荐
相关产品推荐

