El módulo subproceso tiene la función de conveniencia call
, que se implementa como éste, tanto en 2.6 y 3.1:¿Por qué el subprocess.call de python se implementa así?
def call(*popenargs, **kwargs):
return Popen(*popenargs, **kwargs).wait()
La documentación para esta función lleva una advertencia de color rojo, la lectura:
Advertencia : Al igual que
Popen.wait()
, se bloqueará cuando se usenstdout=PIPE
y/ostderr=PIPE
y el proceso secundario genera suficiente salida a una tubería de manera que bloquea la espera de que el búfer de la tubería del SO acepte más datos.
La documentación Popen.wait()
dice que use Popen.communicate()
lugar en tales circunstancias. Bueno, entonces ¿por qué no se implementa call
como se muestra abajo, por lo que se puede eliminar la estúpida advertencia y se pueden eliminar limitaciones estúpidas como esta de la biblioteca estándar?
def call(*args, **kwargs):
input = kwargs.pop("input", None)
p = Popen(*args, **kwargs)
p.communicate(input)
return p.returncode
Estoy seguro de que hay una razón. ¿Qué me estoy perdiendo?
El control de la salida del programa es un reson para usar stdout = PIPE y stderr = PIPE. Es decir, el equivalente de python de 'comando>/dev/null 2> & 1' y luego verificando '$?' En bash. –
¿No sería mejor hacerlo con 'stdout = open ('/ dev/null', 'w'), stderr = STDOUT'? –
@Baffe, supongo, pero el punto es que existe una razón para utilizar los argumentos stdout = y stderr = keyword de 'call'. –