¿Cómo se comparten los datos entre un proceso padre y un proceso hijo bifurcado en Python?

Estoy bastante seguro de que uno haría esto usando la función os.plock (op), pero no tengo idea de cómo. Además, si hay una mejor manera, estaría agradecido de averiguarlo. Los fragmentos de código son muy bienvenidos.

Subproceso reemplaza os.popen, os.system, os.spawn, popen2 y comandos. Un ejemplo simple para tuberías sería:

p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) output = p2.communicate()[0] 

También puede usar un archivo asignado en memoria con el indicador = MAP_SHARED para la memoria compartida entre procesos.

el multiprocesamiento abstrae los tubos y la memoria compartida y proporciona una interfaz de nivel superior. Tomado de la documentación de procesamiento:

 from multiprocessing import Process, Pipe def f(conn): conn.send([42, None, 'hello']) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() p = Process(target=f, args=(child_conn,)) p.start() print parent_conn.recv() # prints "[42, None, 'hello']" p.join() 

Eche un vistazo al nuevo módulo de multiprocesamiento en python 2.6 (también disponible para versiones anteriores como un pyprocessing)

Aquí hay un ejemplo de la documentación que ilustra la información de paso usando un conducto, por ejemplo:

 from multiprocessing import Process, Pipe def f(conn): conn.send([42, None, 'hello']) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() p = Process(target=f, args=(child_conn,)) p.start() print parent_conn.recv() # prints "[42, None, 'hello']" p.join() 

¡Esto es bastante independiente de Python! Es un ejemplo clásico de la comunicación entre procesos de Unix. Una buena opción es usar popen() para abrir una tubería entre los procesos padre e hijo, y pasar datos / mensajes de un lado a otro a lo largo de la tubería.

Eche un vistazo al módulo de subprocess , que puede configurar las canalizaciones necesarias automáticamente mientras genera procesos secundarios.

Tiene dos opciones: os.popen* en el módulo os , o puede usar el módulo de subprocess para el mismo efecto. El manual de Python tiene bastante documentación y ejemplos para popen y subproceso .

Si está realizando una bifurcación de sistema operativo de bajo nivel y realmente desea evitar el uso de tuberías, también es posible utilizar archivos de mapas de memoria compartidos. Esto no es tan bueno como usar subprocess o tuberías popen , pero incluye la respuesta para completar …

Aquí hay un ejemplo completo , pero básicamente puede combinar el manejo de archivos os y los módulos mmap :

 import mmap, os, tempfile fd, tmpfile = tempfile.mkstemp() os.write(fd, '\x00' * mmap.PAGESIZE) os.lseek(fd, 0, os.SEEK_SET) child_pid = os.fork() if child_pid: buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_READ) os.waitpid(child_pid, 0) child_message = buf.readline() print(child_message) os.close(fd) else: buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_WRITE) buf.write('testing\n') os.close(fd)