Cuando se usa pyqt en Windows, ¿qué representa el resultado de QProcess.pid ()?

La documentación para QProcess.pid() dice:

Devuelve el identificador de proceso nativo para el proceso en ejecución, si está disponible. Si actualmente no se está ejecutando ningún proceso, se devuelve 0.

¿Qué significa esto?

Este código se utiliza para explicar mi confusión. Estoy usando Python 2.7.9, PyQt 4 y Windows 7:

 import sys, os, time from PyQt4.QtCore import * from PyQt4.QtGui import * class testLaunch(QWidget): def __init__(self): QWidget.__init__(self) self.process = QProcess(self) self.process.start('calc') self.process.waitForStarted(1000) print "PID:", int(self.process.pid()) if __name__ == "__main__": app = QApplication(sys.argv) main = testLaunch() main.show() sys.exit(app.exec_()) 

Esto inicia la aplicación de calculadora de Windows, como se esperaba. En el administrador de tareas, muestra lo siguiente:

    Calculadora PID

    Esto muestra mi PID como 8304. La statement de print de mi aplicación, sin embargo, muestra:

     PID: 44353984 

    ¿Qué representa esto y cómo se compara con el PID 8304 que informa el administrador de tareas?

    En los sistemas Unix, el pid será un qint64 , pero en Windows se struct así:

     typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION, *LPPROCESS_INFORMATION; 

    PyQt devolverá un sip.voidptr para tal estructura, por lo que está viendo ese valor extraño cuando lo convierte con int() . El pid real que desea es el dwProcessId , por lo que necesitará usar algo como ctypes para extraerlo.

    Aquí hay un código completamente no probado que podría hacer el trabajo:

     import ctypes class WinProcInfo(ctypes.Structure): _fields_ = [ ('hProcess', ctypes.wintypes.HANDLE), ('hThread', ctypes.wintypes.HANDLE), ('dwProcessID', ctypes.wintypes.DWORD), ('dwThreadID', ctypes.wintypes.DWORD), ] LPWinProcInfo = ctypes.POINTER(WinProcInfo) lp = ctypes.cast(int(self.process.pid()), LPWinProcInfo) print(lp.contents.dwProcessID)