我正在使用 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/