я пытаюсь запустить скрипт Python для обработки изображений из PHP
скрипт php
<?php
echo exec('echo $PATH ');
putenv("PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin");
echo "<br>";
echo exec('echo $PATH');
echo "<br>";
echo exec('whoami');
echo "<br>";
echo exec('/usr/bin/python /var/www/html/wordspot/uploads/editimage1.py /var/www/html/wordspot/uploads/test.jpg 2>&1'); ?>
скрипт на питоне
import sys,getopt
import numpy as np
import cv2
imname=str(sys.argv[1])
print imname
img=cv2.imread(imname,0)
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imwrite(imname,thresh1)
в то время как на терминале при выполнении «php test.php» он работает (я запускаю его как root)
в браузере я получаю этот вывод
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin
apache
ImportError: libopencv_core.so.3.0: cannot open shared object file: No such file or directory
я думаю, что импорт cv2.so вызывает эту ошибку (он работает, например, на примере Hello World Python)
Что я могу сделать, чтобы сделать библиотеки opencv видимыми от пользователя apache?
редактировать
Решение: добавление пути к библиотеке в /etc/ld.so.conf.d/opencv.conf
а также executing ldconfig -v
изменил ошибку на "ImportError: libopencv_core.so.3.0: cannot enable executable stack as shared object requires: Permission denied"
После отключения SELinux с помощью setenforce 0
это сработало. (Это не переживет перезагрузку, SELinux нужно отключить в /etc/selinux/config
и изменить на SELINUX=disabled
или предоставляя правильные разрешения в SELinux, чтобы разрешить доступ к библиотеке.)
Где libopencv_core.so.3.0
расположен? Если это в /usr/local/lib
, попробуйте установить LD_LIBRARY_PATH
вот так перед выполнением программы:
putenv("LD_LIBRARY_PATH=/usr/local/lib");
Других решений пока нет …