如何通过subprocess.run获取Python脚本的列表类型输出而非字节串
解决方法
方法1:用ast.literal_eval()解析(推荐,安全)
这是处理Python字面量最安全的方式,只会解析合法的Python数据结构,不会执行恶意代码。
步骤:
- 把捕获的字节串解码成字符串,去掉末尾的换行符
- 用
ast.literal_eval()把字符串转成嵌套列表
示例代码:
import subprocess import ast # 调用random.py并捕获输出 result = subprocess.run(['python', 'random.py'], capture_output=True, text=True) # 清理输出内容,去掉首尾空白(包括换行) output_str = result.stdout.strip() # 解析为原始嵌套列表 target_list = ast.literal_eval(output_str) print(type(target_list)) # 输出 <class 'list'> print(target_list) # 输出 [[1, 2, 'bob'], [1, 2, 'eric'], [2, 1, 'dimitar'], [2, 2, 'kyle']]
方法2:用eval()(不推荐,有风险)
eval()能直接解析字符串为Python对象,但它会执行任意代码,如果输出内容不可信(比如来自外部输入),很容易引发安全问题,仅在你完全可控输出内容时使用。
示例代码:
import subprocess result = subprocess.run(['python', 'random.py'], capture_output=True, text=True) output_str = result.stdout.strip() target_list = eval(output_str) print(type(target_list)) print(target_list)
更规范的方式:用JSON传递数据
如果是你自己编写的两个脚本,更建议用JSON做数据序列化,兼容性更好,跨语言也能用:
- 修改
random.py,输出JSON格式字符串:
import json l1 = [[1, 2, 'bob'], [1, 2, 'eric'], [2, 1, 'dimitar'], [2, 2, 'kyle']] print(json.dumps(l1))
- 在调用脚本中解析JSON:
import subprocess import json result = subprocess.run(['python', 'random.py'], capture_output=True, text=True) output_str = result.stdout.strip() target_list = json.loads(output_str) print(type(target_list)) print(target_list)
内容的提问来源于stack exchange,提问作者mansu kim
相关产品推荐
相关产品推荐

