Python «Модуль без имени ...», когда скрипт выполняется php с shell_exec () - PullRequest
0 голосов
/ 30 октября 2019

Я написал скрипт на python, который импортирует определенный модуль, который я установил с pip.

Когда я запускаю этот скрипт на терминале, как python test.py, все работает нормально, а когда я запускаю help("modules") Iя вижу мой модуль в списке (он хорошо установлен)

Проблема в том, что я пытаюсь запустить этот скрипт с помощью php-скрипта, используя shell_exec("python test.py"), но затем я получаю сообщение об ошибке, что python не знает этот модуль:

ImportError: Нет модуля с именем ...

У вас есть идеи, в чем заключается моя ошибка или как я могу решить эту проблему?


> Редактировать 1:

Итак, я стал пользователем Apache, как сказал мне @LucasMeine, и сначала я вижу, что используемая версия Python была неправильной. Таким образом, я создал псевдоним для хорошего, а затем проверил у пользователя apache и правильной версии python, что модуль существует с использованием help("modules") в терминале. Модуль был в указанном списке, поэтому я не понимаю, почему в моих журналах ошибок Apache я получаю сообщение:

ImportError: Нет модуля с именем ...

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

При вызове shell_exec("python test.py") вы полагаетесь на параметры оболочки, которые развернут команду python в полный путь. Очевидно, что если у вас есть расхождения между настройками ваших учетных записей, вы можете вызвать другую версию Python с разными установленными модулями. Чтобы обойти эту зависимость, вы можете попытаться указать точную версию Python, которую вы хотите запустить, используя полный путь, например,

shell_exec("/usr/bin/python3.5 test.py") 

Чтобы получить путь к вашей установке Python, вы можете запустить which python вваш терминал.

В качестве другого пути решения, вы можете исправить настройки оболочки учетной записи, которая запускает веб-сервер, в соответствии с настройками вашего текущего пользователя.

Cheers!

0 голосов
/ 30 октября 2019

Дело в том, что при использовании shell_exec пользователь apache будет запускать процесс. А пользователь apache не имеет доступа к модулям, которые вы только что установили со своим обычным пользователем, используя pip.

Так что вы можете просто стать пользователем apache:

su -s /bin/bash apache

установить ваши вещи с помощью pip, а затем ваш код должен работать. Также имейте в виду, что у пользователя apache могут быть разные имена в зависимости от вашего дистрибутива linux.

Если вам нужно узнать, кто ваш пользователь apache, проверьте это: https://serverfault.com/questions/125865/finding-out-what-user-apache-is-running-as

и если вашПользователь apache другой, используйте ту же команду, что и выше, но с правильным пользователем. Например, если ваш пользователь apache - httpd:

su -s /bin/bash httpd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...