Php 在Laravel中运行python脚本
因此,我正在尝试在我的Laravel5.3中运行python脚本 此功能在我的控制器内。这只是将数据传递给我的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
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();