2009-12-18 3 views
1

У меня возникла загадочная проблема при попытке импортировать модуль в python только при вызове сценария из php через систему или exec.Ошибка импорта python при вызове из PHP

Из питона оболочки:

import igraph #This works. 

если предыдущая строка была в файле, скажем, test_module.py, то:
питон test_module.py в Баш работает.

В PHP:
Exec ("Питон test_module.py", $ выход, $ RetVal) -> не удается: $ RetVal = 1.

Однако, если скрипт вместо: import math, то это хорошо.

Кто-нибудь когда-либо имел дело с чем-то подобным?

+0

добавить 'import sys; print sys.path' в ваш скрипт. – jfs

+0

'import os, site; print os.environ.get («PYTHONPATH»), site.USER_SITE; help (site) 'также может помочь. – jfs

+0

Я не вижу различий в sys.path внутри моей оболочки или внутри скрипта, вызванного PHP. –

ответ

0

Является ли модулем igraph в стандартном модульном пути Python или находится в том же каталоге, что и ваш индивидуальный скрипт? Если это так, вполне возможно, что PHP вызывает файл python с другим рабочим каталогом и пытается импортировать вещи относительно этого пути, а не путь к сценарию.

+0

В оболочке python: import igraph; print igraph .__ file__ возвращает /usr/lib/python2.4/site-packages/python_igraph-0.5.2-py2.4-linux-x86_64.egg/igraph/__init__.pyc Родительский каталог/usr/lib/python2 .4/site-packages/находится внутри sys.path при вызове из PHP-скрипта. Файл python_igraph-0.5.2-py2.4-linux-x86_64.egg также находится в пределах sys.path. –

+0

Вы пытались получить вывод из команды (либо путем указания аргумента 'output' для вызова' exec() ', либо вместо него вместо этого использовать' passthru() '), чтобы точно увидеть, какую ошибку создает python при вызове из php ? – Amber

+0

Я пробовал это сделать. Кажется, он не выводит сообщения об ошибках Python, поэтому я понятия не имею, что происходит. Однако оно имеет возвращаемое значение 1. –

1

одна вещь, чтобы проверить это sys.path

увидеть, что разница при вызове каждого из способов

+1

Как уже говорилось выше. Я не вижу различий между sys.path. –

0

Это происходит потому, что вы установили эти пакеты под другим пользователем, может быть, корень, или что-то еще.

Как я отлаживал это, я проверял вывод sys.path для обоих случаев (shell и php exec, у которых есть пользовательские www-данные по умолчанию), и чем я сравнивал оба.

Я заметил, что путь '/root/.local/lib/python2.7/site-packages' пропал, когда я запустил его из PHP, который содержал именно эти недостающие пакеты. Так что я просто скопировал содержимое этой папки в '/usr/lib/python2.7/dist-packages/', что решило проблему.

+0

Плохая идея - скопировать пакеты python вручную. Вы должны использовать 'apt-get', чтобы установить пакеты Python в'/usr/lib/python2.7/dist-packages/'.В противном случае используйте 'pip', чтобы установить пакеты Python (возможно, в' virtualenv'). Вероятно, вы не хотите запускать 'pip' под пользователем root. – jfs

Смежные вопросы