Rhodri James <rho...@kynesim.co.uk>: > On 27/02/2019 06:56, Marko Rauhamaa wrote: >> Then there's the question of a sufficient way to prevent premature >> garbage collection: >> >> def fun(): >> f = open("lock") >> flock.flock(f, fcntl.LOCK_EX) >> do_stuff() >> f.close() >> sys.exit(0) >> >> def fun(): >> f = open("lock") >> flock.flock(f, fcntl.LOCK_EX) >> do_stuff() >> f.close >> sys.exit(0) >> >> def fun(): >> f = open("lock") >> flock.flock(f, fcntl.LOCK_EX) >> do_stuff() >> f >> sys.exit(0) >> >> def fun(): >> f = open("lock") >> flock.flock(f, fcntl.LOCK_EX) >> do_stuff() >> sys.exit(0) > > I would go with: > > def fun(): > with open("lock") as f: > flock.flock(f, fcntl.LOCK_EX) > do_stuff() > sys.exit(0) > > The description of the with statement does explicitly say that the > context manager's __exit__() method won't be called until the suite > has been executed, so the reference to the open file must exist for at > least that long.
Yeah, but the *true* answer, of course, is: def fun(): f = os.open("lock", os.O_RDONLY) flock.flock(f, fcntl.LOCK_EX) do_stuff() sys.exit(0) Collect that! ;-) Marko -- https://mail.python.org/mailman/listinfo/python-list