[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