Как заставить две программы на Python взаимодействовать? - PullRequest
2 голосов
/ 28 апреля 2009

У меня есть HTTP-сервер в одной программе, а основное приложение - в другой. Они оба являются петлями, поэтому я понятия не имею, как:

  1. Напишите скрипт, который запустит приложение, а затем сервер HTTP;
  2. Заставить эти программы обмениваться данными в действии.

Как обычно это делается? Я действительно оценил бы решения Python, потому что мои сценарии написаны на Python.

  1. Делает ли пользователь запрос http, который запрашивает у приложения некоторые данные и возвращает результат? Да

  2. Собирает ли приложение данные и сохраняет их где-нибудь? Приложение и HTTP-сервер используют базу данных SQLite. Однако базы данных могут отличаться.

Ответы [ 6 ]

3 голосов
/ 28 апреля 2009

Что ж, вы, вероятно, можете просто использовать модуль subprocess . Для обмена данными вы можете просто использовать потоки Popen.stdin и Popen.stdout. Конечно, нет никаких ограничений на способы, которыми вы / могли / делаете это. CORBA , DBUS , общая память , DCOP , список можно продолжить. Но сначала попробуйте простой способ, в данном случае это обычные каналы / потоки Python.

3 голосов
/ 28 апреля 2009

а) Вы можете запускать приложения, используя os.system :


os.system("command")

или вы можете использовать модуль subprocess . Больше информации здесь .

б) использовать розетки

2 голосов
/ 28 апреля 2009

Прежде чем ответить, я думаю, нам нужна дополнительная информация:

  1. Есть ли здесь определенный поток информации?
    1. Делает ли пользователь запрос http, который запрашивает у приложения некоторые данные и возвращает результат?
    2. Собирает ли приложение данные и сохраняет их где-нибудь?

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

[Редактировать] Исходя из вашего ответа, я думаю, что есть несколько способов сделать это:

  1. Если вы можете получить доступ к базе данных приложения с веб-сервера, вы можете легко получить нужную информацию оттуда. Опять же, это зависит от того, какую информацию вы хотите обменять.
  2. Если вашему приложению просто нужно дать http-серверу некоторые результаты, вы можете записать их в таблицу результатов в базе данных http-сервера.
  3. Используйте конвейеры или подпроцессы, как другие люди предложили напрямую обмениваться данными с фоновым приложением.
  4. Используйте файл журнала, в который ваше приложение может записывать, а ваш http-сервер считывать.

Еще несколько вопросов:

  1. Вам нужна двусторонняя связь, или http-сервер просто показывает результаты?
  2. Какой веб-сервер вы используете?
  3. Какие языки обработки у вас есть на нем?

В зависимости от степени зависимости двух частей может быть лучше написать новое приложение для проверки базы данных вашего приложения на наличие изменений (с использованием перехватов или опроса и т. Д.) И опубликовать соответствующую информацию в собственной базе данных http-сервера. Преимущество этого состоит в том, что эти две части менее тесно связаны, что часто является хорошей вещью.

У меня есть веб-сервер (Apache 2), который общается с приложением Django с помощью модуля fastcgi. Взгляните на раздел в djangobook на fastcgi . Apache использует сокеты (или обычный tcp) для общения с фоновым приложением (Django).

[Edit 2] Упс - только что заметил, что ваш веб-сервер сам является процессом python. Если это все Python, то вы можете запускать каждый в своем собственном потоке и передавать им оба Очереди объекты, которые позволяют двум процессам отправлять друг другу информацию либо блокирующим, либо неблокирующим образом. .

1 голос
/ 28 апреля 2009

возможно витая - это то, что вы ищете

1 голос
/ 28 апреля 2009

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

http://mail.python.org/pipermail/python-list/2006-August/568346.html

0 голосов
/ 28 апреля 2009

Когда я пишу веб-приложения на Python, я всегда держу свой веб-сервер в том же процессе, что и мои фоновые задачи. Я не знаю, какой веб-сервер вы используете, но я лично использую CherryPy . У вашего приложения может быть множество потоков, которые могут быть веб-сервером, с любым другим количеством потоков, которые вам нравятся в качестве фоновых задач. Таким образом, вам не нужен какой-либо сложный IPC с сокетами, именованными каналами и т. Д. Вместо этого вы просто получаете доступ к общим, глобальным, синхронизированным структурам данных для передачи информации, и ваши разные модули могут напрямую вызывать функции друг друга.

РЕДАКТИРОВАТЬ: Чтобы уточнить, вы можете использовать модуль потоков для запуска вашего сервера CherryPy в других потоках, чем другие блокирующие серверы. Например:

def listener():
    sock = get_socket_from_somewhere()
    while True:
        client, addr = sock.accept()
        # send data back to client, etc

from threading import Thread
t1 = Thread(target=listener)
t1.setDaemon(True)
t1.start()

cherrypy.quickstart() # you'd need actual arguments here

В этом примере показано, как создать блокирующий сервер в одном потоке в том же процессе, что и веб-сервер (в данном случае CherryPy, хотя это может быть что угодно).

...