Прошлой ночью я потратил 5,5 часа, пытаясь заставить PHP исполниться и получить выходные данные Python-скрипта Virtualenv. Ничего не сработало; за исключением сценариев, которые не были Virtualenv.
Что я пытаюсь сделать:
Я пытаюсь заставить PHP вызывать виртуальную установку выходного текста Newspaper lib при его вызове.
Что у меня сейчас:
PHP: (Обновлено)
<?php
$output = exec('newspaper2/bin/python3 /var/www/html/components/python/test.py 2>&1', $output2);
print_r(error_get_last());
echo $output2;
echo $output;
… Это работает при использовании не виртуального сценария
Python: (Обновлено)
from newspaper import Article
url = 'http://example.com/'
article = Article(url)
article.download()
article.html
article.parse()
article.authors
article.publish_date
string = article.text
print(string)
В чем проблема:
Я могу запустить скрипт, который PHP запускает из командной строки, и он выводит просто отлично.
Что я пробовал:
С PHP (я пробовал все вызовы «exec» для PHP), он не может открыть виртуальную среду и ничего не возвращает.
Перед сценарием я назвал «python3» и еще несколько вещей безрезультатно.
Да, я сделал его исполняемым…
Я чувствую, что это должно быть так просто.
Я пробовал предложения на других постах и во всем Интернете, но безрезультатно.
Вопросы:
Спасибо за помощь;
PS: я использую Ubuntu16, PHP7 и мне нужно использовать Python3
В сценариях virtualenv (т. Е. Установленных через точки входа в setuptools) не следует прикасаться к шебангу (#!...
первая строка). Он населен виртуальностью & Setuptools & сопутствующие инструменты.
Если вы укажете свой собственный шебанг, то это не виртуальный сценарий. В этом случае вызовите python напрямую:
exec('/path/to/venv/bin/python3 /var/www/html/components/python/testing.py');
В качестве альтернативы, вы можете указать абсолютный путь к бинарному python для virtualenv к py-script, но это не выглядит хорошей идеей.
Также помните, что virtualenv не перемещаются. Поэтому они должны оставаться на пути, где они были созданы.
Также обратите внимание, что exec()
возвращает только последнюю строку вывода. Вы, вероятно, хотите shell_exec()
или же exec('...', $output)
чтобы получить весь вывод.
Также неясно, что происходит с вашим скриптом и что печатается на stderr. Попробуйте эту команду, чтобы увидеть, что является ошибкой:
exec('/path/to/script 2>&1', $output)
#OR:
exec('/path/to/venv/bin/python3 /path/to/script 2>&1', $output)
Хорошо, я наконец понял это и многому научился в процессе. newspaper
lib, которую я использую по умолчанию, пытается записать в базу домашнего каталога пользователей. В этом случае он пытался написать www-data
, /var/www
,
Чтобы исправить это:
settings.py
файл в newspaper
библиотека.DATA_DIRECTORY = '.newspaper_scraper'
и изменить его на DATA_DIRECTORY = '.path/to/writable/directory'
Я понятия не имею, почему это не возвращало ошибки, которые объяснили бы это раньше.
Надеюсь, это поможет кому-нибудь еще.
Огромное спасибо Сергею Васильеву за помощь. Я очень ценю это.