У меня проблема, которая сводит меня с ума. Я провел буквально дни на этом, и я еще не мог решить это. У меня есть PHP-скрипт (дублированный objectsBabylonGLTF.php для примера), который использует функцию PHP exec () для вызова скрипта Python 2.7 (omekaitemfileslist2.py). Мой веб-сервер — Apache, а сервер — Ubuntu Server 16.04.
$omekaOutput = [];
exec('python omekaitemfileslist2.py 28 2>&1', $omekaOutput, $status);
print_r($omekaOutput);
Этот скрипт Python, в свою очередь, использует API Омека (Цифровая система управления активами). Файл Python API клиента (содержащий набор функций HTTP-глаголов (GET, POST …) для общения с Omeka DAMS называется omekaclient.py.
Другими словами, omekaitemfilelist2.py импортирует в него файл omekaclient.py, который, в свою очередь, импортирует модули omekaclient.py (три модуля), в том числе модуль Python httplib2.
Я получаю ошибку:
Array(
[0] => Traceback (most recent call last):
[1] => File "omekaitemfileslist2.py", line 6, in
[2] => from omekaclient import OmekaClient
[3] => File "/var/www/html/map/omekaclient.py", line 4, in
[4] => import httplib2
[5] => ImportError: No module named httplib2)
Таким образом, это означает, что omekaitemfileslist2.py выполняется и omekaclient.py выполняется (я много играл с разрешениями на моем сервере Ubuntu — кажется, это не проблема с разрешениями).
httplib2 устанавливается как Python 3 и python 2, хотя здесь мои скрипты используют Python2. Кроме того, другие требуемые модули (urllib3) также устанавливаются таким же образом и не создают проблем.
Я посмотрел на конфигурацию apache2, включил моды для cgi и python — ничего странного! Я изменил разрешения — ничего! Сумасшедшая вещь в том, что если я переключу порядок импорта urllib3 до httplib2, жалоб не будет (только жалоба на httplib2 не найдена)
Но подождите, это еще более странно, чем это. Намек на проблему появился, когда я попытался вставить в omekaclient.py код для импорта модуля Python, указав путь:
import imp
httplib2 = imp.load_source('httplib2', '/home/hb/.local/lib/python2.7/site-packages/httplib2/__init__.py')
Мы получаем на стороне PHP некоторые интересные странные вещи о Permission Error 13. Посмотрите любезно.
Array(
[0] => Traceback (most recent call last):
[1] => File "omekaitemfileslist2.py", line 6, in
Array(
[0] => Traceback (most recent call last):
[1] => File "omekaitemfileslist2.py", line 6, in
[4] => httplib2 = imp.load_source('httplib2', '/home/hb/.local/lib/python2.7/site-packages/httplib2/__init__.py')
[5] => IOError: [Errno 13] Permission denied)
И еще одна вещь, все работает как шарм, когда я запускаю все из терминала сервера.
Даже если я попытался запустить все из PHP на сервере в интерактивном терминале (через php -a) или даже в виде файла через опцию -f (в этом отношении все работает нормально):
php -f objectsBabylonGLTF.php
Все скрипты питонов запускаются из терминала нормально.
Я должен упомянуть, что статус функции exec () PHP равен 1 (что обычно, если все хорошо, должно быть 0).
Еще один совет, который я получил в последнее время, — это мой PHP-скрипт, если я скажу (просто для выяснения вещей):
$command = "python3 --version ";
exec($command, $output, $status);
print_r($output);
Я получаю в качестве вывода (без сюрпризов):
Array ( [0] => Python 3.5.2 )
Теперь, если я попробую на Python2:
$command = "python2 --version ";
exec($command, $output, $status);
print_r($output);
Я получаю в качестве вывода (ничего !!!):
Array ( )
Теперь подождите, если я перенаправлю stderror в stdoutput для Python 2:
$command = "python --version 2>&1";
exec($command, $output, $status);
print_r($output);
Угадай, что я получаю:
Array ( [0] => Python 2.7.12 )
Пожалуйста, любая помощь будет принята с благодарностью. заранее спасибо
Задача ещё не решена.
Других решений пока нет …