Отправка параметра в скрипт Python, работающий в фоновом режиме из переполнения стека

У меня есть скрипт Python (analy.py), который принимает имя файла в качестве параметра и анализирует его. Когда это сделано с анализом, он ждет другого имени файла. Что я хочу сделать, это:

  1. Отправить имя файла в качестве параметра из PHP в Python.
  2. Запустите analy.py в фоновом режиме как демон с именем файла, которое пришло из PHP.

Я могу опубликовать параметр из PHP в качестве аргумента командной строки в Python, но я не могу отправить параметр в скрипт Python, который уже работает в фоновом режиме.

Есть идеи?

0

Решение

Очевидный ответ здесь:

  1. Бежать analyze.py один раз за имя файла, вместо того, чтобы запускать его как демон.
  2. Проходить analyze.py целый ряд имен файлов при запуске, вместо того, чтобы передавать их по одному.

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

  • Используйте стандартный ввод скрипта Python для передачи ему данных, записав в него из (PHP) родительского процесса. (Я не уверен, как это сделать из PHP, или даже если это возможно, но это довольно просто из Python, sh и многих других языков, так что…)
  • Откройте сокет TCP, сокет Unix, именованный канал, анонимный канал и т. Д., Отдав один конец дочернему элементу Python, а другой оставив его в родительском PHP. (Обратите внимание, что первый действительно является частным случаем этого — под прикрытием стандартный ввод — это просто анонимный канал между дочерним и родительским элементами.)
  • Откройте область общей памяти или mmap-ed файл, или аналог как в родительском и дочернем. Вероятно, это также требует совместного использования семафора, который вы можете использовать для создания условия или события, поэтому у ребенка есть некоторый способ ждать следующего ввода.
  • Используйте некоторый высокоуровневый API, который объединяет одно из вышеперечисленных — например, запишите дочерний элемент Python как простой HTTP-сервис (или JSON-RPC или ZeroMQ или почти все, что вы можете найти в хороших библиотеках на обоих языках); PHP-код запускает эту службу и делает запросы как клиент.
1

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

Вот что я сделал.

PHP часть:

<?php

$param1 = "filename";

$command = "python analyze.py ";
$command .= " $param1";

$pid = popen( $command,"r");
echo "<body><pre>";
while( !feof( $pid ) )
{
echo fread($pid, 256);
flush();
ob_flush();
}
pclose($pid);

?>

Python Part:

1. I used [JSON-RPC]: https://github.com/gerold-penz/python-jsonrpc to
create a http service that wraps my python script (runs forever)
2. Created a http client that calls the method of http service.
3. Printed the results in json format.

Работает как шарм.

0