0

我正在尝试在我的 laravel 应用程序中显示在 python 中使用 plotly 生成的图。

当我python3.8 ../storage/app/public/rcs/line-chart.py从 laravel 项目的公共目录在终端中执行命令时,会显示该图。但是,当我向我的 laravel 应用程序发送请求以使用symfony 进程组件执行相同的命令时,没有显示任何内容。

这是负责执行命令和生成数据的控制器:

<?php

namespace App\Http\Controllers;

use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;

class FooController extends Controller
{
    public function bar()
    {
        $process = new Process(['python3.8', '../storage/app/public/line-chart.py']);

        try {
            $process->mustRun();
            return $process->getOutput();
        } catch (ProcessFailedException $exception) {
            return $exception->getMessage();
        }
    
    }
}

情节是这样生成的:

import plotly.express as px

df = px.data.gapminder().query("continent=='Oceania'")
fig = px.line(df, x="year", y="lifeExp", color='country')
fig.show()

PS:除了使用 javascript 的 plotly 之外,还有什么比使用 symfony 进程组件更好的方法来达到预期的结果?

4

1 回答 1

0

好吧,显然一种方法是将绘图保存为 HTML 文件,然后在 laravel 中将其显示为视图。但我没有将此标记为答案,希望其他人发布更好的答案。

这就是它的工作原理:

import plotly.express as px

df = px.data.gapminder().query("continent=='Oceania'")
fig = px.line(df, x="year", y="lifeExp", color='country')
fig.showwrite_html('/paht/to/output/file')

然后在控制器中:

<?php

namespace App\Http\Controllers;

use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;

class FooController extends Controller
{
    public function bar()
    {
        $process = new Process(['python3.8', '../storage/app/public/line-chart.py']);

        try {
            $process->mustRun();
            return view('/paht/to/output/file');
        } catch (ProcessFailedException $exception) {
            return $exception->getMessage();
        }
    
    }
}


于 2021-10-23T10:00:52.987 回答