You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Django的views.py中获取外部algorithm.py生成的Python列表?

解决方案:将字节串形式的列表输出转换为Python列表

遇到这种从子进程输出字节串并转换为Python列表的问题,我推荐使用**字符串解码+ast.literal_eval**的组合方式,这是既安全又可靠的方案,刚好适配你当前的场景。

具体步骤和代码示例:

  1. 首先将子进程返回的字节数据解码为普通字符串,同时去除多余的换行/回车符
  2. 使用ast.literal_eval将字符串形式的列表解析为真正的Python列表(这个方法比eval安全,只会解析Python字面量,不会执行任意代码)

以下是修改后的views.py代码片段:

import ast
import sys
from subprocess import run, PIPE

def your_view(request):
    if request.method == "POST":
        lec_name = request.POST['selected_name']
        # 调用algorithm.py并获取输出
        result = run([sys.executable, '//Projects//altg//algorithm.py', lec_name], shell=False, stdout=PIPE)
        
        # 1. 解码字节串为字符串,并清理换行符
        output_str = result.stdout.decode('utf-8').strip('\r\n')
        
        # 2. 转换为Python列表
        try:
            schedule_list = ast.literal_eval(output_str)
            # 此时schedule_list就是你需要的列表类型了
            print(type(schedule_list))  # 输出: <class 'list'>
            print(schedule_list)       # 输出: [['0', 'Subject01(IS0001)', ...], ['1', ...]]
        except (SyntaxError, ValueError) as e:
            # 处理解析失败的情况(比如algorithm.py输出格式有误)
            print(f"解析列表失败:{str(e)}")
            schedule_list = []
        
        # 后续可以将schedule_list传递给模板或者进行其他处理
        # ...

为什么这个方法可行?

  • 你的子进程输出是标准的Python列表格式(用单引号包裹字符串),ast.literal_eval完美支持这种格式,而json.loads会因为单引号报错(JSON要求双引号),这也是很多人尝试后失败的原因。
  • decode('utf-8')把字节数组转换成了Python字符串,是后续解析的必要前提。
  • strip('\r\n')彻底清理了输出末尾的换行符,避免解析时出现语法错误。

额外注意事项:

确保algorithm.py的输出只有你需要的列表内容,不要有额外的print语句(比如调试信息),否则会导致解析失败。如果必须有其他输出,可以考虑让algorithm.py用sys.stdout.write()只输出列表部分,或者在views.py里对output_str做进一步过滤提取。

内容的提问来源于stack exchange,提问作者BK94

火山引擎 最新活动