2010-10-13 22 views
8

J'ai deux applications python. J'ai besoin d'envoyer des commandes et des données entre eux (entre deux processus). Quelle est la meilleure façon de faire cela? Un programme est un démon qui doit accepter les commandes et les paramètres d'une autre application GUI.Comment échanger des données entre deux applications python?

Comment puis-je faire démon pour surveiller les commandes à partir de l'interface graphique, tout en faisant son travail? Je préfère la solution serait crossplatform.

p.s. J'utilise pyqt4 et python.

+1

Similaire à http://stackoverflow.com/questions/3902997/capturing-output-from-buffered-stdout-program/3905899#3905899 –

+0

Oh, lien utile. Merci. Je ne l'ai pas trébuché pendant la recherche. – PocketSam

Répondre

10

Vous pouvez utiliser les méthodes suivantes pour l'échange de données:

  1. Programmation Socket: Dans Qt, vous pouvez accéder le module QtNetwork. Voir l'assistant qt pour les exemples

  2. IPC: Utiliser la mémoire partagée implémentée dans la classe QSharedMemory.

  3. Si cette application fonctionnera sur os unix seulement, vous pouvez essayer Posix file d'attente basée sur des messages, etc. pour l'échange de données

  4. DBUS: Vous trouverez à la fois python et Qt ont un support à base DBus. Dans le cas de python, vous devez trouver le module correspondant.

  5. en utilisant le module Multi Processing

  6. En utilisant le mécanisme IPC basé Posix/SystemV aka pipes, queue, etc.

+0

Est-il possible d'interagir entre des applications utilisant uniquement python? Par exemple avec module de sous-processus et Popen.communicate. Vous pensez que l'utilisation de la bibliothèque Qt serait plus facile? – PocketSam

+0

-1: Impossible de mentionner les tuyaux ordinaires et sys.stdin ordinaires et sys.stdout. –

+0

@S. Lott - Je ne suis pas sûr que 'sys.stdin' serait utile dans ce cas si c'est un démon communiquant avec une interface graphique car il est peu probable qu'une fois que le processus lancerait l'autre. –

2

Bien qu'il soit pas lié à la façon de la communication, je vous recommande extraire le module pickle/cPickle (qui peut encoder des objets en flux de chaînes et vice versa). Très utile.

0

Exemple.

Program_1.py

import pickle 
import sys 
for i in range(100): 
    pickle.dump(i,sys.stdout) 

Program_2.py

from __future__ import print_function 
import pickle 
import sys 
while True: 
    obj= pickle.load(sys.stdin) 
    print(obj) 

Utilisation:

Program_1.py | Program_2.py 

Sous Windows, cela peut présenter un comportement mauvais à cause de la façon dont Windows bâcle en simple fichier IO redirections.

Questions connexes