使用Symfony中的Process获取退出代码(1)错误和错误输出输出

时间:2019-07-19 11:43:58

标签: php python symfony

我正在使用Symfony 3.4开发应用程序,并且必须使用一些python脚本。 我使用Symfony的Process Component执行我的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(一般错误)

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

1 个答案:

答案 0 :(得分:0)

Python函数sys.exit()仅用于传递Python进程退出状态,而不用于传递进程之间的应用程序结果。如果Python进程正常终止,则调用sys.exit(0)。如果发生错误,请致电sys.exit(1)sys.exit("error-message-string")。您的Python代码将浮点数传递到sys.exit(),该浮点数的值为1,导致Symfony Process打印错误消息。

相反,使用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;
    }
}