Shell_exec在PHP中返回NULL

时间:2018-12-05 18:28:06

标签: php python shell-exec

我正在研究这个项目,需要我在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返回print命令的字符串。但是我在“ var_dump”上得到的是NULL,并且如果我回显$ jadi,也什么也没有。使用print还是print(json)命令

有趣的是,当我尝试显示仅包含1行代码的python文件中的字符串时。

Python虚拟文件:

print("Hello")

“ Hello”字符串在我的PHP上显示得很好。那么,shell_exec是否无法读取许多代码?还是我做错了什么?

2 个答案:

答案 0 :(得分:0)

我终于找到了背后的原因。在我的python脚本中,有以下命令:

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

它们将我在训练过程中存储的numpy数组加载到KNN中,我需要再次使用它们作为python中图像分类过程的参考。我将它们分开是因为我担心如果我的PHP页面加载时间太长。在最终对上传的图片进行分类之前,需要处理所有训练数据。 但是,当我从PHP执行python文件时,我猜它在解析了这2个加载命令后返回了错误。我尝试将print命令放在它们下面,但该命令在PHP上停止显示。既然现在都是这样,那么即使采取了最糟糕的选择,也别无选择,即使这会花费我很长的加载时间。

答案 1 :(得分:-1)

我在控制台中对此进行了测试:

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