Проблемы с модулями Python при исполнении из PHP Script - PullRequest
0 голосов
/ 01 сентября 2018

У меня проблема, которая сводит меня с ума. Я провел буквально дни на этом, и я еще не мог решить это. У меня есть 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 ) 

Пожалуйста, любая помощь будет принята с благодарностью. Заранее спасибо

...