Как python использует пути, когда скрипт вызывается с помощью eval () из скрипта php и когда та же функция вызывается из скрипта bash? - PullRequest
0 голосов
/ 20 марта 2020

У меня есть исполняемый скрипт python, который архивирует данные с сервера mysql с использованием библиотеки py mysql. Сценарий хорошо работает из командной строки.

Я вызываю этот сценарий из php сценария, используя функцию escapeshellcmd, и я заставил его работать.

Я также создал bash скрипт, который я намерен использовать из crontab для архивации информации. Я также могу заставить этот скрипт работать, внеся изменения, описанные ниже.

Каким-то образом я попал в python версии и проблемы с путями.

, если я включу

#!/home/tim/anaconda3/bin/python

в качестве первой строки скрипта python работает при вызове скриптом php (я полагаю, что www-data как пользователь). Он не работает из сценария bash или командной строки, выдавая следующую ошибку:

  File "./signal_archive.py", line 22, in <module>
    import pymysql
ModuleNotFoundError: No module named 'pymysql'

Однако, если первая строка сценария python выглядит следующим образом:

#!/usr/bin/python3

скрипт работает из скрипта bash и командной строки, но не из скрипта php. Выдает следующую ошибку:

  File "/home/tim/python/commodities_related/signal_archive.py", line 23, in <module>
    import pandas as pd
ModuleNotFoundError: No module named 'pandas'

Оба пакета установлены в моей системе. Думая, что указание сценария на путь поможет, я добавил следующее к сценарию python, но пока безуспешно.

sys.path.append('/usr/lib/python3/dist-packages:')
sys.path.append('/usr/local/lib/python3.5/dist-packages:')

Очевидно, что я что-то упускаю; Я думаю, что сценарий php вызывается www-user, и я не знаю путь по умолчанию. Файл bash вызывается моим пользователем по пути, указанному в файле .bashr c. Тем не менее, мне может понадобиться указать apache или php (www-user), чтобы использовать указанную c установку python.

РЕДАКТИРОВАТЬ - чтобы быть более понятным, php скрипт (phpfile1. php) вызывает скрипт python. Когда я вызываю phpfile1. php из другого скрипта php (phpfile2. php), работающего на apache2, я все работаю, используя

#!/home/tim/anaconda3/bin/python

Когда я вызываю тот же файл (phpfile1. php ) из другого сценария php (phpfile3. php) из сценария bash это не удается. Кроме того, если я запускаю файл на месте с помощью следующего

./signal_archive.py

, я получаю сообщение об ошибке, но если я запускаю его с помощью следующей команды, это работает:

python signal_archive.py

Любые идеи, если это правильно или как это сделать? Спасибо.

1 Ответ

0 голосов
/ 21 марта 2020

Я исправил это в 2 этапа:

Оказалось, что мне нужно было добавить путь к anaconda3 в мой файл .bash_profile.

export PATH="/home/tim/anaconda3/bin:$PATH"

Когда установлен anaconda3, он модифицирует файл .bashr c с помощью предыдущего фрагмента кода. Однако в этом случае .bash_profile изменил ситуацию.

Я также изменил верхнюю часть файла python, чтобы использовать путь anaconda для выполнения, а также добавил путь для указанных c python пакеты.

#!/home/tim/anaconda3/bin/python
import sys
sys.path.insert(1, '/usr/local/lib/python3.5/dist-packages')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...