اذهب إلى المحتوى

السؤال

نشر

لدي جزء من متحكّم controller في لارافيل أريد أن يقوم بتنفيذ أو استدعاء سكريبت مكتوب بلغة بايثون،

بفرض لدي سكريبت بايثون موجود في المسار التالي، حاولت إيجاد الأمر المناسب للاستدعاء:

public function fire()
{
    $this->call('C:\Python34\python H:\myapp\app\python\questionPopulator.py');
}


public function fire()
{
    $this->line('C:\Python34\python H:\myapp\app\python\questionPopulator.py');
}

ولكنها لم تجدي لأن لارافيل يتوقع استدعاء أمر آخر في لارافيل أيضاً وليس بايثون، ماهي الطريقة المناسبة لذلك؟

Recommended Posts

  • 0
نشر

يوجد ثلاث طرق لتنفيذ السكريبت الخارجي الخاص ببايثون عن طريق PHP فلا داعي لاستخدام تابع في لارافيل لتنفيذ ذلك:

أولاً:

 system('C:\Python34\python H:\myapp\app\python\questionPopulator.py');

ثانياً:

exec('C:\Python34\python H:\myapp\app\python\questionPopulator.py');

ويمكن أيضاً عن طريق هذا التابع تمرير متحولات أو قيم، مثال:

<?php

// outputs the username that owns the running php/httpd process

$output=null;
$retval=null;
exec('whoami', $output, $retval);
echo "Returned with status $retval and output:\n";
print_r($output);

?>

ثالثاً وهي الطريقة الأفضل:

$result = shell_exec('C:\Python34\python H:\myapp\app\python\questionPopulator.py');

وهي بدورها تعيد string، ثم يمكنك ترميز النتيجة لنمط JSON وبذلك يمكنك إبقاء النظامين منفصلين دون أن يؤثر أحدهما على الآخر.

  • 0
نشر

يُمكنك إستخدام حزمة symfony/process فلارافيل تستخدمها من المفروض تكون مُثبتة مُسبقاً مع الإعتماديات. 

للتأكد أنها مُثبتة:

composer show symfony/process

أمر التثبيت:

composer require symfony/process

الإستخدام:

<?php
// إستدعاء الكلاسات
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;

// الإستخدام
$process = new Process(['python','/path/to/your_script.py']);
$process->run();

if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}

echo $process->getOutput();

 

  • 0
نشر

يمكنك استخدام دالة shell_exec وهذه الدالة تستخدم لتنفيذ الأوامر عبر shell وتقوم بارجاع المخرجات الكاملة كسلسلة. مثال عليها: 

shell_exec("python path/to/script.py 2>&1");

أو يمكن استخدام Symfony Process هذه المكتبة ايضا تمكنك من تشغيل ملفات بايثون باستخدام لارافل كل ما عليك هو تثبيت الحزمة باستخدام الأمر التالي

composer show symphony/process

ويمكن استخدامها بهذا الشكل 

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

//$process = new Process('python /path/to/your_script.py');
$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();

يمكنك إضافتها للمتحكم عن طريق وضعها بدالة وليكن اسمها runPython بهذا الشكل 

public function runPython()
{
    $process = new Process("python3 /var/www/laravel/myLaravelApp/app/PythonScript/test.py");
    $process->run();
    
    if (!$process->isSuccessful()) {
        throw new ProcessFailedException($process);
    }

    $data = $process->getOutput();

    dd($data);
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...