¿Se comunica varias veces con un proceso sin romper la tubería?

No es la primera vez que tengo este problema, y ​​realmente me molesta. Cada vez que abro una tubería utilizando el módulo de subprocess Python, solo puedo communicate con él una vez, como especifica la documentación: Read data from stdout and stderr, until end-of-file is reached

 proc = sub.Popen("psql -h darwin -d main_db".split(),stdin=sub.PIPE,stdout=sub.PIPE) print proc.communicate("select a,b,result from experiment_1412;\n")[0] print proc.communicate("select theta,zeta,result from experiment_2099\n")[0] 

El problema aquí es que la segunda vez, Python no está contento. De hecho, decidió cerrar el archivo después de la primera comunicación:

 Traceback (most recent call last): File "a.py", line 30, in  print proc.communicate("select theta,zeta,result from experiment_2099\n")[0] File "/usr/lib64/python2.5/subprocess.py", line 667, in communicate return self._communicate(input) File "/usr/lib64/python2.5/subprocess.py", line 1124, in _communicate self.stdin.flush() ValueError: I/O operation on closed file 

¿Se permiten múltiples comunicaciones?

Creo que no entiendes comunicarte …

http://docs.python.org/library/subprocess.html#subprocess.Popen.communicate

Comunicarse envía una cadena al otro proceso y luego la espera para finalizar … (Como ha dicho, espera a que el EOF escuche el stdout y el stderror)

Lo que debes hacer en su lugar es:

 proc.stdin.write('message') # ...figure out how long or why you need to wait... proc.stdin.write('message2') 

(y si necesita obtener el stdout o stderr usaría proc.stdout o proc.stderr)

He tenido este problema antes, y por lo que puedo imaginar, no se pudo hacer esto con un subprocess (lo cual, estoy de acuerdo, es muy poco intuitivo si es cierto). Terminé usando pexpect (obtenible de PyPI).

Puedes usar:

 proc.stdin.write('input') if proc.stdout.closed: print(proc.stdout) 

Puede hacerlo simplemente con una sola llamada de se communicate() :

 query1 = 'select a,b,result from experiment_1412;' query1 = 'select theta,zeta,result from experiment_2099;' concat_query = "{}\n{}".format(query1, query2) print(proc.communicate(input=concat_query.encode('utf-8'))[0]) 

El punto clave aquí es que solo escribe una vez en la stdin y \n sirve como EOL. su subproceso psql lee desde stdin hasta \n , luego, después de que finaliza la primera consulta, vuelve a stdin , momento en el cual solo queda la segunda cadena de consulta en el búfer.