Shell_exec возвращает значение NULL в PHP - PullRequest
0 голосов
/ 05 декабря 2018

Я работаю над этим проектом, который требует, чтобы я загружал изображения на PHP, выполнял изображение на python, извлекал вывод из python и снова отображал его на PHP.

Код PHP:

<?php 
$command = shell_exec("python C:/path/to/python/KNNColor.py");
$jadi = json_decode($command);
var_dump($jadi);
?>

Код Python:

from PIL import Image
import os
import glob
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color
from scipy.stats import skew

#data train untuk warna
Feat_Mom_M = np.load('FeatM_M.npy')
Feat_Mom_I = np.load('FeatM_I.npy')

Malay_Col_Train = Feat_Mom_M

Indo_Col_Train = Feat_Mom_I

#Data warna
All_Train_Col = np.concatenate((Malay_Col_Train, Indo_Col_Train))

Y_Indo_Col = [0] * len(Indo_Col_Train)
Y_Malay_Col = [1] * len(Malay_Col_Train)

Y_Col_Train = np.concatenate((Y_Malay_Col, Y_Indo_Col))

Train_Col = list(zip(All_Train_Col, Y_Col_Train))

from collections import Counter 
from math import sqrt
import warnings 

#Fungsi KNN
def k_nearest_neighbors(data, predict, k):
   if len(data) >= k:
       warnings.warn('K is set to a value less than total voting groups!')
   distances = []
   for group in data:
      for features in data[group]:
        euclidean_dist = np.sqrt(np.sum((np.array(features) - np.array(predict))**2 ))
        distances.append([euclidean_dist, group])

votes = [i[1] for i in sorted(distances)[:k]]
vote_result = Counter(votes).most_common(1)[0][0]

return vote_result

image_list = []

image_list_pixel = []

image_list_lab = []

L = []
A = []
B = []

for filename in glob.glob('C:/path/to/pic/uploaded/batik.jpg'):
   im=Image.open(filename)
   image_list.append(im)
   im_pix = np.array(im)
   image_list_pixel.append(im_pix)
   #ubah RGB ke LAB
   im_lab = color.rgb2lab(im_pix)
   #Pisah channel L,A,B
   l_channel, a_channel, b_channel = cv2.split(im_lab)
   L.append(l_channel)
   A.append(a_channel)
   B.append(b_channel)
   image_list_lab.append(im_lab)

 <The rest is processing these arrays into color moment vector, it's too long, so I'm skipping it to the ending>

   Feat_Mom = np.array(Color_Moment)

   Train_Set_Col = {0:[], 1:[]}

for i in Train_Col:
    Train_Set_Col[i[-1]].append(i[:-1])

new_feat_col = Feat_Mom

hasilcol = k_nearest_neighbors(Train_Set_Col, new_feat_col, 9)

 import json
 if hasilcol == 0:
    #print("Indonesia")
    print (json.dumps('Indonesia'));
 else:
    #print("Malaysia")
    print (json.dumps('Malaysia'));

Итак, как вы можете видеть, существует только одна команда печати.Shell_exec должен вернуть строку команды печати из python.Но то, что я получаю на «var_dump», равно NULL, и если я повторяю $ jadi, там тоже ничего нет.Будь то с помощью команды print или print (json)

Самое интересное, когда я пытаюсь отобразить строку из этого файла python, которая состоит только из одной строки кода.

Файл-пустышка Python:

print("Hello")

Строка "Hello", прекрасно отображается на моем PHP.Итак, shell_exec не может прочитать много кодов?или я что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Я наконец нашел причину этого.В моем скрипте Python есть следующие команды:

Feat_Mom_M = np.load('FeatM_M.npy')
Feat_Mom_I = np.load('FeatM_I.npy')

Они загружают массивы, которые я сохранил в процессе обучения в KNN, и мне нужно снова использовать их в качестве ссылок для процесса классификации изображений в Python,Я разделил их, потому что боялся, что загрузка моей страницы PHP займет слишком много времени.Необходимо будет обработать все данные тренировки, прежде чем окончательно классифицировать загруженное изображение.Но потом, когда я выполняю свой файл python из PHP, я думаю, он возвращает ошибку после анализа этих двух команд загрузки.Я экспериментировал, помещая команду print под ними, и она перестала отображаться на PHP.Поскольку сейчас все так, то нет другого пути, кроме как выбрать худший вариант, даже если бы это стоило мне долгого времени загрузки.

0 голосов
/ 06 декабря 2018

Я проверил это в консоли:

php > var_dump(json_decode("Indonesia"))
php > ;
php shell code:1:
NULL
php > var_dump(json_decode('{"Indonesia"}'))
php > ;
php shell code:1:
NULL
php > var_dump(json_decode('{"Indonesia":1}'))
php > ;
php shell code:1:
class stdClass#1 (1) {
  public $Indonesia =>
  int(1)
}
php > var_dump(json_decode('["Indonesia"]'))
php shell code:1:
array(1) {
  [0] =>
  string(9) "Indonesia"
}

Вы должны обернуть его в {} или [], и оно будет считано в объект или массив.

Послеошибка, вы можете запустить эту json_last_error() http://php.net/manual/en/function.json-last-error.php, и она выдаст вам код ошибки, который должен быть возвращен JSON_ERROR_SYNTAX

...