我需要在两个Python应用程序之间发送命令和数据(进程之间),目的是让一个程序(守护进程)接受来自另一个图形用户界面(GUI)应用程序的命令和参数。我需要守护进程能够监控GUI发来的命令,同时完成自己的工作。我更倾向于跨平台的解决方案,因为我使用 PyQt4 和 Python。
2.解决方案
- Socket 编程:
在 PyQt 中,您可以使用 QtNetwork 模块,该模块包含了访问网络套接字的类和函数,例如 QTcpSocket 和 QUdpSocket。您可以使用这些类来创建网络套接字,并在两个应用程序之间建立连接。
# 服务端代码
import socket
# 创建服务端套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定套接字到本地地址和端口
server_socket.bind(('localhost', 1234))
# 开启监听
server_socket.listen(1)
# 接受客户端连接
client_socket, client_address = server_socket.accept()
# 从客户端接收数据
data = client_socket.recv(1024)
# 关闭客户端套接字
client_socket.close()
# 关闭服务端套接字
server_socket.close()
# 客户端代码
import socket
# 创建客户端套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务端
client_socket.connect(('localhost', 1234))
# 发送数据给服务端
client_socket.send(b'Hello, world!')
# 接收服务端返回的数据
data = client_socket.recv(1024)
# 关闭客户端套接字
client_socket.close()
- IPC 共享内存:
您可以使用 QSharedMemory 类来实现进程间共享内存。
# 服务端代码
import sys
from PyQt5.QtCore import QSharedMemory
# 创建共享内存
shared_memory = QSharedMemory('my_shared_memory')
# 分配共享内存
if not shared_memory.create(1024):
print("Unable to create shared memory")
sys.exit(1)
# 打开共享内存
shared_memory.lock()
# 写入数据到共享内存
shared_memory.write("Hello, world!")
# 关闭共享内存
shared_memory.unlock()
# 客户端代码
import sys
from PyQt5.QtCore import QSharedMemory
# 打开共享内存
shared_memory = QSharedMemory('my_shared_memory')
if not shared_memory.attach():
print("Unable to attach to shared memory")
sys.exit(1)
# 读出共享内存中的数据
data = shared_memory.read(1024)
# 关闭共享内存
shared_memory.detach()
- 多进程模块:
您可以使用 Python 的 multiprocessing 模块来创建多个进程,并让它们之间通信。
# 服务端代码
import multiprocessing
# 创建一个进程并启动它
process = multiprocessing.Process(target=worker_function, args=(10,))
process.start()
# 等待进程结束
process.join()
def worker_function(num):
# 做一些工作
print("Worker function: {}".format(num))
# 客户端代码
import multiprocessing
# 创建一个进程并启动它
process = multiprocessing.Process(target=worker_function, args=(20,))
process.start()
# 等待进程结束
process.join()
def worker_function(num):
# 做一些工作
print("Worker function: {}".format(num))
- Pickle/cPickle 模块:
您可以使用 pickle 或 cPickle 模块将对象序列化为二进制数据并发送给另一个应用程序,然后在另一个应用程序中反序列化这些数据以获取对象。
# 服务端代码
import pickle
# 创建一个对象
obj = {'name': 'John Doe', 'age': 30}
# 将对象序列化为二进制数据
data = pickle.dumps(obj)
# 发送二进制数据给客户端
# 客户端代码
import pickle
# 接收二进制数据
data = received_data
# 将二进制数据反序列化为对象
obj = pickle.loads(data)
# 使用对象
print("Name:", obj['name'])
print("Age:", obj['age'])
以上是几种常用的在 Python 应用程序之间交换数据的方法。您需要根据具体情况选择合适的方法。