1

我正在使用 Symfony 3.4 开发一个应用程序,我必须使用一些 python 脚本。我使用 Symfony 的流程组件来执行我的 python 脚本,我得到了一个我不明白的退出代码:1(一般错误)。此外,我看到我的预期输出出现在 ErrorOutput 中,这正常吗?

这是我的python脚本(index.py):

import scipy.stats as stats
import sys

\#Kendall Coefficient

def kendallcoeff(x1,x2):
    tau, p_value = stats.kendalltau(x1,x2)
    return tau

sys.exit(float(kendallcoeff(sys.argv[1],sys.argv[2])))
\#sys.exit(sys.argv)

在我的 php 类中,我有以下代码:

$process = new Process("python3 python/index.py",null,["arg1" => $timeArray,"arg2" => $speedArray]);
$process->run();

当我取消注释 sys.exit(sys.argv) 时,我得到错误输出:

"['python/index.py']"

这表明我的论点没有正确传递给我的脚本。

我总是得到:

命令“python3 python/index.py”失败。

退出代码:1(一般错误)

有人可以向我解释为什么我会得到这个吗?

4

1 回答 1

0

Python 函数sys.exit()仅用于传递 Python 进程退出状态,而不是进程之间的应用程序结果。sys.exit(0)如果 Python 进程正常终止,则调用。打电话sys.exit(1)sys.exit("error-message-string")如果有错误。你的 Python 代码传递一个浮点数,sys.exit()结果为 1,导致 Symfony 进程打印错误消息。

相反,使用 print() 将 Python 应用程序结果传递给 Symfony PHP。(有关获取 Python 进程输出的几种方法,请参阅https://symfony.com/doc/3.4/components/process.html。)

由于 $timeArray 和 $speedArray 是数组,因此在命令行中将它们传递给 Python 是有问题的,因为它们可能被视为两个以上的参数。所以下面的代码将数组作为一个 JSON 字符串传递。

Python 脚本 {symfony-base}/public/python/index.py) :

#!/usr/bin/python3

import json
import scipy.stats as stats
import sys

def kendallcoeff(x1,x2):
    tau, p_value = stats.kendalltau(x1,x2)
    return tau

print(sys.argv)
json_data = sys.argv[1]
python_obj = json.loads(json_data)
timeArray = python_obj[0]
speedArray = python_obj[1]

print(kendallcoeff(timeArray,speedArray))

sys.exit(0)

PHP Symfony 类 src/Controller/KendallCoefficientController.php 应该如下所示:

<?php

namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;
use Symfony\Component\Routing\Annotation\Route;

class KendallCoefficientController extends AbstractController
{
    /**
     * @Route("/kendall", name="kendall")
     */
    public function index()
    {
        $timeArray = [1.0, 2.0, 3.0];
        $speedArray = [10.1, 20.2, 30.3];
        $arg = json_encode([$timeArray, $speedArray]);
        $process = new Process(['python3', 'python/index.py', $arg]);
        $process->run();

        // executes after the command finishes
        if (!$process->isSuccessful()) {
            throw new ProcessFailedException($process);
        }

        $pyoutput = $process->getOutput();

        $response = new Response($pyoutput, Response::HTTP_OK,
            ['content-type' => 'text/plain']);
        return $response;
    }
}
于 2019-07-19T20:11:44.553 回答