我正在使用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(一般错误)
有人可以向我解释为什么我得到这个吗?
答案 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;
}
}