Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel中运行python脚本_Php_Python_Exec_Shell Exec_Orb - Fatal编程技术网

Php 在Laravel中运行python脚本

Php 在Laravel中运行python脚本,php,python,exec,shell-exec,orb,Php,Python,Exec,Shell Exec,Orb,因此,我正在尝试在我的Laravel5.3中运行python脚本 此功能在我的控制器内。这只是将数据传递给我的python脚本 public function imageSearch(Request $request) { $queryImage = 'c:\\\xampp\\\htdocs\\\identificare_api\\\public\\\gallery\\\herbs\\\query.png'; //queryImage $trainImage = 'c:\\\xa

因此,我正在尝试在我的Laravel5.3中运行python脚本

此功能在我的控制器内。这只是将数据传递给我的python脚本

public function imageSearch(Request $request) {
    $queryImage = 'c:\\\xampp\\\htdocs\\\identificare_api\\\public\\\gallery\\\herbs\\\query.png'; //queryImage
    $trainImage = 'c:\\\xampp\\\htdocs\\\identificare_api\\\public\\\gallery\\\herbs\\\2nd.png'; //trainImage
    $trainImage1 = 'c:\\\xampp\\\htdocs\\\identificare_api\\\public\\\gallery\\\herbs\\\3rd.png';
    $trainImage2 = 'c:\\\xampp\\\htdocs\\\identificare_api\\\public\\\gallery\\\herbs\\\4th.jpg';
    $trainImage3 = 'c:\\\xampp\\\htdocs\\\identificare_api\\\public\\\gallery\\\herbs\\\1st.jpg';

    $data = array
        (
            array(0, $queryImage),
            array(1, $trainImage),
            array(3, $trainImage1),
            array(5, $trainImage2),
            array(7, $trainImage3),
        );

    $count= count($data);
    $a = 1;
    $string = "";

    foreach( $data as $d){
        $string .= $d[0] . '-' . $d[1];

        if($a < $count){
            $string .= ","; 
        }
        $a++;

    }

    $result = shell_exec("C:\Python27\python c:\xampp\htdocs\identificare_api\app\http\controllers\ORB\orb.py " . escapeshellarg($string));

    echo $result;
}
我已经尝试过在不使用Laravel的情况下运行这两个文件,并且效果很好。但是当我试图将php代码集成到我的Laravel中时,它什么也没有显示。状态代码为200 OK

编辑:问题已解决。在PHP代码中,只需更改

然后,你也可以这样做

$queryImage = public_path() . "\gallery\herbs\query.png";
使用Symfony过程。

安装:

composer require symfony/process
代码:


对我有效的解决方案是在末尾添加2>&1

shell_exec("python path/to/script.py 2>&1");
我遇到的问题是没有错误,也没有回应,我有错误的脚本路径,但没有办法知道。2> &1将重定向调试信息作为结果


使用Symfony流程将非常方便

确保symphony可用于您的项目中

composer show symphony/process
如果未安装
composer,则不需要symfony/process

然后做一些事情,比如

use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;

//$process = new Process('python /path/to/your_script.py'); //This won't be handy when going to pass argument
$process = new Process(['python','/path/to/your_script.py',$arg(optional)]);
$process->run();

// executes after the command finishes
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}

echo $process->getOutput();

我编辑了上面的问题。我不能再使用你建议的Symfony流程了。无论如何谢谢你!这实际上给了我一个异常,显示了一个微妙的错误,为什么“shell_exec”不能工作。我留下了symfony版本,以防将来出现更多错误。谢谢。如下所示,我使用symphony进程调用了我在虚拟环境中的python脚本。我的脚本导入了一个库(从pip下载),并通过shell命令运行良好,但奇怪的是,当从Laravel调用脚本时,无法找到导入的库,ModuleNotFound异常。你已经遇到这个问题了吗?(lib路径已经在python路径中)@mg3你解决了那个问题了吗,这就是我遇到的问题,“未找到模块pymysql”@caro…是的,我的问题是我正在使用虚拟环境,我为我的python文件和库创建了一个特殊的环境。所以在命令行中,我从这个环境中启动文件,但从Laravel,它在我的笔记本电脑上使用了普通的python环境,而不是包含适当库的虚拟环境。解决方案是使用Laravel命令在启动python脚本之前激活适当的虚拟环境。类似于:$process=newprocess(“c:\Users\myPC\Envs\cloudscraster\Scripts\activate.bat&&python{$path}myFile.py{$json}”);
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;

$process = new Process(['python', '/path/to/your_script.py']);
$process->run();

// executes after the command finishes
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}

echo $process->getOutput();
shell_exec("python path/to/script.py 2>&1");
composer show symphony/process
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;

//$process = new Process('python /path/to/your_script.py'); //This won't be handy when going to pass argument
$process = new Process(['python','/path/to/your_script.py',$arg(optional)]);
$process->run();

// executes after the command finishes
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}

echo $process->getOutput();