php - 获取退出代码(一)在Symfony中使用Process的Error输出中的错误和输出

标签 php python symfony

我正在使用 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(一般错误)

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

最佳答案

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;
    }
}

关于php - 获取退出代码(一)在Symfony中使用Process的Error输出中的错误和输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57111846/

相关文章:

php - 如何在 Grocery 店中减去 DateTime?

python - Python 3 字节的奇怪符号

python - 浮点计算调试

android - 推送通知 Symfony/Sly notification Pusher 上的 400 错误请求

php - 无法将 PHP 连接到 bluemix 中的 db2

php - 在函数范围外引用变量的更好方法是什么?

php - Laravel 创建多个用户表

python - Selenium 逻辑之旅 - 如果通过第一个场景,则移动到下一个 url - Python

php - Symfony2 - 检测用户是否在安全防火墙内

php - 有效电子邮件地址的 Swift_RfcComplianceException,适用于 Windows 而不是 Ubuntu