Использование PHP для вызова Python-скрипта Virtualenv

Прошлой ночью я потратил 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» и еще несколько вещей безрезультатно.

Да, я сделал его исполняемым…

Я чувствую, что это должно быть так просто.

Я пробовал предложения на других постах и ​​во всем Интернете, но безрезультатно.

Вопросы:

  • Я неправильно настроил virtualenv?
  • Вверху скрипта Python вместо «#! / Usr / bin / env python3» я должен вызывать что-то еще?
  • Если так, где я могу найти это? Должен ли я начать с нуля, и будет ли это
    Помогите?

Спасибо за помощь;

PS: я использую Ubuntu16, PHP7 и мне нужно использовать Python3

1

Решение

В сценариях 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)
1

Другие решения

Хорошо, я наконец понял это и многому научился в процессе. newspaper lib, которую я использую по умолчанию, пытается записать в базу домашнего каталога пользователей. В этом случае он пытался написать www-data, /var/www,

Чтобы исправить это:

  1. Перейти к settings.py файл в newspaper библиотека.
  2. Изменить переменную DATA_DIRECTORY = '.newspaper_scraper' и изменить его на DATA_DIRECTORY = '.path/to/writable/directory'
  3. Сохраните файл, и вы должны быть в порядке.

Я понятия не имею, почему это не возвращало ошибки, которые объяснили бы это раньше.

Надеюсь, это поможет кому-нибудь еще.

Огромное спасибо Сергею Васильеву за помощь. Я очень ценю это.

0

По вопросам рекламы [email protected]