Don’t ever do this unless it’s really what you want:
import os def some_func(fd): f = os.fdopen(fd, 'w') f.write('abc') fd = get_some_fd() some_func(fd) some_other_func(fd)
Here’s what goes wrong: when some_func comes to an end, f (which is a file-like objects) goes out of scope, is destructed, which causes fd to be closed. I think this is pretty weird behavior (an object closing an fd it didn’t open itself), but well.
Here’s a better version, for reference:
def some_func(fd): f = os.fdopen(os.dup(fd), 'w') #Use f here
Try this on fd 0/1/2 in an (I)Python shell
The issue has nothing to do with Python per se — that’s the way fdopen() is defined in libc. The man-page directly says, “The file descriptor is not dup’ed, and will be closed when the stream created by fdopen() is closed.”
But yes, I can see how this might be a surprising effect…
Josh is right. This is normal behavior. You should make it a habit to dup() the file descriptor
I am looking for some idea and stumble upon your posting decide to wish you Thanks. Eugene