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