[pyar] Lidiando con el límite de file descriptors abiertos y subprocess

Andrés Gattinoni andresgattinoni en gmail.com
Mar Ago 23 10:03:41 ART 2011


Hola listeros,

El otro día mandé un mail pero con el problemita de USLA quizás se
perdió en la estratósfera (además de que primero pregunté una cosa,
después lo resolví y cambié mi pregunta).
Así que vuelvo a plantear mi problema más claramente a ver si alguien
me puede ayudar a resolver esto.

Tengo este script:
http://pastebin.com/zsbzLABn

Es un hook para el SVN para el evento pre-commit, que toma todos los
scripts de PHP, JS y BASH que hayan sido modificados y corre un
chequeo de sintaxis para evitar comitear archivos con ese tipo de
errores. El script funciona bien en general, pero cuando tiene que
chequear una gran cantidad de archivos da problemas.

Concretamente el error que me está dando ahora es este:

Traceback (most recent call last):
  File "/home/subversion/svn_test/hooks/pre-commit", line 188, in <module>
    sys.exit(main(sys.argv))
  File "/home/subversion/svn_test/hooks/pre-commit", line 184, in main
    return check_commit(rep, txn)
  File "/home/subversion/svn_test/hooks/pre-commit", line 169, in check_commit
    errors += check_file(f, checkers, rep, txn)
  File "/home/subversion/svn_test/hooks/pre-commit", line 148, in check_file
    r = check(tmpfile, filename)
  File "/home/subversion/svn_test/hooks/pre-commit", line 85, in check_php
    return run([_PHP_PATH, '-l', filename], filename, realname)
  File "/home/subversion/svn_test/hooks/pre-commit", line 67, in run
    stderr=subprocess.PIPE)
  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1039, in _execute_child
    errpipe_read, errpipe_write = os.pipe()
OSError: [Errno 24] Too many open files

Según tengo entendido esto tiene que ver con los file descriptors que
se abren cuando uso subprocess.PIPE para capturar la salida de los
subprocesos que ejecuto (los intérpretes de PHP, BASH y JS).
El tema es que no sé cómo puedo hacer para cerrar esos descriptores
una vez que ya los usé. Como pueden ver en el código, probé llamando
explícitamente a p.stdout.close() pero no cambia nada.
Cuál es la manera adecuada de manejar esto?

Gracias de antemano.

Saludos,

A



More information about the pyar mailing list