----------------------------- On Thu, Mar 19, 2015 12:16 AM CET Steven D'Aprano wrote:
>On Thu, 19 Mar 2015 07:22 am, Albert-Jan Roskam wrote: > >> >> ---------------------------- >> On Wed, Mar 18, 2015 7:06 PM CET Rustom Mody wrote: >> >>On Wednesday, March 18, 2015 at 8:12:12 PM UTC+5:30, Robert Clove wrote: >>> ./my_eth_script.pl eth0 M > a.txt >>> >>> How can i run this command with subprocess.popen >> >>Something like this I guess? >> >>> proc = Popen("cat", shell=True, stdout=open(inname, "w"), >>> stdin=open(outname,"r")) >> >> >> How will the file object associated with in name be closed? (When is >> close() method called? > >Depends on the interpreter. > >CPython (the one you are probably using) will notice immediately the proc >object goes out of scope and is garbage-collected. That will free up the >Popen stdout argument, which will garbage collect the file object, which >will close the inname file immediately. > >Assuming there are no circular references involved. If there are, then the >file won't be closed until the second garbage collector gets to run. It >will break the circular reference and close the file, but there is no >promise as to how often it will run. The user can configure how often it >runs and even whether it runs at all. > >On the other hand, Jython will garbage-collect the file object, but the file >itself may remain open until your code exits, and only be closed on >interpreter-shutdown. Since the operator system probably has limits on how >many files you can have open at once, you might actually run out. > >For quick and dirty scripts, it doesn't matter, but best practice is to >explicitly close your files as soon as possible, preferably with a `with` >statement: > > ># I think inname and outname are reversed... >with open(inname, "w") as outfile, open(outname, "r") as infile: > proc = Popen("cat", shell=True, stdout=outfile, stdin=infile) > # do stuff with proc > # when finished, save the stuff you care about > result = ... > >print(result) > > >Outside of the `with` block, proc's stdout and stdin will be automatically >closed, even if the block exits with an exception. Thanks, this is indeed what I was thinking about. I had no idea about the GC differences between cpython and jython (reference counting vs true, java GC). I am amazed that jython is just a version 2.3, is it tries to look like cpython 2.3! But perhaps they're about to jump to 3.4 -- https://mail.python.org/mailman/listinfo/python-list