On 2015-06-02, Marko Rauhamaa <ma...@pacujo.net> wrote: > Skip Montanaro <skip.montan...@gmail.com>: > >> On Tue, Jun 2, 2015 at 10:28 AM, Marko Rauhamaa <ma...@pacujo.net> wrote: >>> >>> The only problem is that you don't know how high you need to go in >>> general. >> >> Sure, but I didn't know anyway, so no matter what upper bound I choose >> (or what function I choose/implement), it's just going to be a guess. >> os.closerange just codifies the straightforward procedure. > > Under linux, the cleanest way seems to be going through the files under > /proc/self/fd: > > def close_fds(leave_open=[0, 1, 2]): > fds = os.listdir(b'/proc/self/fd') > for fdn in fds: > fd = int(fdn) > if fd not in leave_open: > os.close(fd) > > No need for a upper bound.
Or use the more generic code that I already posted in this thread: def closeall(min=0, max=4096, keep=()): """Close all open file descriptors except for the given exceptions. Any file descriptors below or equal to `min`, or in the set `keep` will not be closed. Any file descriptors above `max` *might* not be closed. """ # First try /proc/self/pid try: for fd in os.listdir("/proc/self/fd"): try: fd = int(fd) except ValueError: continue if fd >= min and fd not in keep: os.close(int(fd)) return except OSError as exc: if exc[0] != errno.ENOENT: raise # If /proc was not available, fall back to closing a lot of descriptors. for fd in range(min, max): if fd not in keep: try: os.close(fd) except OSError as exc: if exc[0] != errno.EBADF: raise This function could use os.closerange(), but if the documentation is correct and it ignores *all* errors and not just EBADF, then it sounds like os.closerange() should not in fact ever be used for any purpose. -- https://mail.python.org/mailman/listinfo/python-list