python - 父进程无法访问 PyQt 中的共享内存

标签 python pyqt shared-memory qprocess

我目前正在 PyQt 中试验 QSharedMemoryQProcess。因此,我编写了一个小应用程序来启动一个进程,该进程创建一个共享内存段并向其中写入数据。当进程写入输出时,应用程序会读回数据。

不幸的是,当应用程序尝试附加到共享内存段时,我收到此错误:QSharedMemory::handle: 不存在。看起来父进程无法访问子进程分配的shader内存段,除非该内存段是父进程自己分配的。

输出跟踪:

process state: Starting
process state: Running
process started
process output: Done writing to shared memory
Error accessing shared memory from parent process QSharedMemory::handle: doesn't exist 
Error accessing data
process state: Not running
process finished

我的应用程序代码:

from PyQt4 import QtGui, QtCore
import sys
import pickle

class Widget(QtGui.QWidget):
    def __init__(self):
        super(Widget,self).__init__()

        # create process
        self.p = QtCore.QProcess(self)    

        # Connect to process output 
        self.p.readyReadStandardOutput.connect( self.on_process_output )
        self.p.readyReadStandardError.connect( self.on_process_error_output )
        self.p.stateChanged.connect(self.on_process_state_change)                   
        self.p.finished.connect(self.on_process_finished)        
        self.p.started.connect(self.on_process_started)
        self.p.error.connect( self.on_process_error )

        self.key = 'share_mem_key'
        self.shmem = QtCore.QSharedMemory( self.key )

        self.p.start( 'python.exe shmem_process_test.py "%s"' % self.key )

    def on_process_output(self):        
        s_out = bytes.decode( bytes( self.sender().readAllStandardOutput() ) )        
        print 'process output: %s' % (s_out)

        if not self.shmem.isAttached() and not self.shmem.attach():
            print 'Error accessing shared memory from parent process: %s ' % self.shmem.errorString()

        self.shmem.lock()
        try:
            data = self.shmem.data()
            if data:                
                print pickle.loads(data.asstring())
        finally:
            print 'Error accessing data'
            self.shmem.unlock()

    def on_process_error_output(self):
        s_out = bytes.decode( bytes( self.sender().readAllStandardError() ) )                
        print 'process output: %s' % (s_out)

    def on_process_state_change(self,new_state):        
        states = ["Not running", "Starting", "Running"]        
        print 'process state: %s' % (states[new_state])

    def on_process_finished(self):
        print 'process finished'

    def on_process_started(self):
        print 'process started'

    def on_process_error(self):
        print 'process error'

# application loop    
app = QtGui.QApplication(sys.argv)
widget = Widget()

widget.show()
app.exec_()

我的流程代码:

from PyQt4 import QtCore
import ctypes
import ctypes.util
import pickle
import sys

CLIB = ctypes.cdll.LoadLibrary(ctypes.util.find_library('c'))

def main(argv):   
    key = argv[1]

    # write to shared memory      
    data = range(50)
    data_bytes = pickle.dumps( data, pickle.HIGHEST_PROTOCOL)
    data_len = len(data_bytes)      

    shmem = QtCore.QSharedMemory(key)

    if not shmem.create(data_len):
        sys.stderr.write( 'ERROR: shared memory creation' )
        sys.stderr.flush()        
        return

    if not shmem.isAttached() and not shmem.attach():
        sys.stderr.write( 'ERROR: shared memory access' )
        sys.stderr.flush()        
        return 

    shmem.lock()
    try:
        CLIB.memcpy(int(shmem.data()), data_bytes, data_len)
    finally:
        shmem.unlock()

    sys.stdout.write( "Done writing to shared memory" )
    sys.stdout.flush()

if __name__ == '__main__':
    main(sys.argv)

最佳答案

来自 QSharedMemory 文档(重点是我的):

Warning: QSharedMemory changes the key in a Qt-specific way. It is therefore currently not possible to use the shared memory of non-Qt applications with QSharedMemory.

不确定你能做你想做的事(无论如何都是可移植的)。

关于python - 父进程无法访问 PyQt 中的共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5134412/

相关文章:

python - 将一个列表拆分为三个具有步长和起点的列表

python - 静态方法 - 如何从另一个方法调用一个方法?

multithreading - 使用 atomic_init 而不是 atomic_store 有什么优势吗?

c++ - 与linux和windows c++兼容的共享内存库

python - 另一个具有功能的开关盒

python - NumPy 数组 : Efficiently find matching indices

qt - 如何正确处理具有重叠鼠标区域的 QML TableView 中的鼠标事件?

python - PyQt4无法导入Qsci

python - QWebEngineView:显示加载进度

c - `shm_open` 使用什么类型的内存对象?