2010-10-13 28 views
8

Tôi có hai ứng dụng python. Tôi cần gửi các lệnh và dữ liệu giữa chúng (giữa hai tiến trình). Cách tốt nhất để làm điều đó là gì?Làm thế nào để trao đổi dữ liệu giữa hai ứng dụng python?

Một chương trình là một daemon sẽ chấp nhận các lệnh và tham số từ một ứng dụng GUI khác.

Làm cách nào để làm cho daemon giám sát các trình diễn từ GUI, trong khi thực hiện công việc? Tôi thích giải pháp sẽ là nền tảng chéo.

p.s. Tôi sử dụng pyqt4 và python.

+1

Tương tự như http://stackoverflow.com/questions/3902997/capturing-output-from-buffered-stdout-program/3905899#3905899 –

+0

Ồ, liên kết hữu ích. Cảm ơn. Không vấp ngã nó trong khi tìm kiếm. – PocketSam

Trả lời

10

Bạn có thể sử dụng các phương pháp sau đây để trao đổi dữ liệu:

  1. Lập trình Socket: Trong Qt bạn có thể truy cập vào mô-đun QtNetwork. Xem trợ lý qt cho các ví dụ

  2. IPC: Sử dụng bộ nhớ dùng chung được triển khai trong lớp QSharedMemory.

  3. Nếu ứng dụng này sẽ chạy trên unix os chỉ, sau đó bạn có thể thử Posix dựa nhắn xếp hàng vv để trao đổi dữ liệu

  4. DBUS: Bạn sẽ tìm thấy cả hai python và Qt đã dbus dựa hỗ trợ. Trong trường hợp của python bạn cần phải tìm các mô-đun có liên quan.

  5. Sử dụng đa xử lý mô-đun

  6. Sử dụng cơ chế IPC Posix/Hệ dựa aka đường ống, hàng đợi vv

+0

Có thể tương tác giữa các ứng dụng chỉ bằng python không? Ví dụ với mô-đun subprocess và Popen.communicate. Bạn nghĩ rằng việc sử dụng thư viện Qt sẽ dễ dàng hơn? – PocketSam

+0

-1: Không thể đề cập đến các đường ống thông thường và sys.stdin thông thường và sys.stdout. –

+0

@S. Lott - Tôi không chắc chắn 'sys.stdin' sẽ hữu ích trong trường hợp này nếu nó là một daemon giao tiếp với một GUI vì nó không chắc rằng một khi quá trình sẽ được khởi chạy khác. –

2

Trong khi nó không liên quan đến cách của truyền thông, tôi khuyên bạn nên kiểm tra mô đun pickle/cPickle (có thể mã hóa các đối tượng thành các chuỗi chuỗi và ngược lại). Rất hữu dụng.

0

Ví dụ.

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) 

Cách sử dụng:

Program_1.py | Program_2.py 

Dưới Windows, điều này có thể biểu hiện hành vi xấu vì cách Windows botches lên tập tin đơn giản IO chuyển hướng.

Các vấn đề liên quan