One of the things I like about the Spyder ide is the ability to highlight a block of code, and use 'Run Cell': I'll write several blocks of code and test them this way. As much of my work involves editing database field values, I'll often write original values to a text file before running an update cursor so I can see if what I'm trying to do actually works. Typically I'll do it like this:
blah blah blah... logFile = r'C:\scripts\logs\name.txt' logoutput = open(logFile,'w') sys.stdout = logoutput # lets me use print() statements blah blah print('Something') blah blah print('Something else') logoutput.close()
It's line 13 that goofs on me in Spyder. If I .close() my file handle, the console window never returns to the In [#]: prompt, so it appears that the that the cell is still running. If I open my text file it has all the records in it. If I comment out line 13, the cell runs, and returns to the In [#]: prompt. The text file is exactly the same as if I leave it as is.
There doesn't seem to be anything different syntax wise in open(), write() close() between Python 3.x or 2.x. Anyone else seeing things like this?
I have found with non-inline output, that you 'close' outside. For example, if you set matplotlib graphs to anything other than 'inline' in your preferences, the graph opens up in a separate window. you close it from there.
There should be no need to close the file, since it should close itself, unless there is some reason to keep it open? but the [in] prompt would appear if it was still open.
If it bugs you check
ccordoba12 is one of the chief maintainers and he would probably have a specific explanation because of the interlinkages of spyder, pyqt and all the other dependencies
I don't use spyder, but does using a context manager have the same issue? Actually, I bet it probably does.
I think you should save and then reset sys.stdout after you rediredirect it to a file.. I would guess that you lose your prompt, because by closing the file, you've closed sys.stdout...
import sys logFile = r'C:\temp\test.txt' stdout = sys.stdout #<== save original sys.stdout with open(logFile, 'w') as logoutput: sys.stdout = logoutput # lets me use print() statements print('Blah') sys.stdout = stdout #<== reset sys.stdout print(logoutput.closed) # Check it's closed print(open(logFile).read()) # Check what was written to it earlier
And to avoid messing with sys.stdout at all:
from __future__ import print_function with open('filename', 'w') as f: print('some text', file=f)
with open('filename', 'w') as f: print('some text', file=f)