У меня проблема, которая сводит меня с ума. Я провел буквально дни на этом, и я еще не мог решить это. У меня есть 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 Omeka (Система управления цифровыми активами). Файл 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 некоторые интересные странные сведения об ошибке разрешения 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
Все скрипты питона запускаются из терминала нормально.
Я должен отметить, что состояние функции PHP exec () равно 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 )
Пожалуйста, любая помощь будет принята с благодарностью. Заранее спасибо