I am building a fairly complex application using Python and PySide. Finally the day of the release is nearing so I want to build this application as an exe.
However, I have a strange problem on my hands. I've used PyInstaller (using version 2 by the way) in the past and never had this happened to me.
Basically, when I build the application with the
BadFileDescriptor error and the consequently memory access violation are caused by the fact that the
stdout of applications in windowed mode is a fixed size buffer.
So, if you have are writing to
stdout, either with
sys.stdout directly, after some time you'd see those errors.
You can fix this by:
logginginstead of printing to stdout
stdoutat the beginning of the execution of your application. This is the solution that requires less code to be changed, even though I think moving the debugging statements to
loggingwould be the better choice.
stdout you can use this kind of code:
import sys import tempfile sys.stdout = tempfile.TemporaryFile() sys.stderr = tempfile.TemporaryFile()
Just before executing your program. You can use also some custom object to put the output in "log" files or whatever, the important thing is that the output should not fill the fixed size buffer.
For example you could do something like this to be able to take advantage of the
logging module without changing too much code:
import sys import logging debug_logger = logging.getLogger('debug') debug_logger.write = debug_logger.debug #consider all prints as debug information debug_logger.flush = lambda: None # this may be called when printing #debug_logger.setLevel(logging.DEBUG) #activate debug logger output sys.stdout = debug_logger
The downside of this approach is that
stdout.write for each line:
>>> print 'test' DEBUG:debug:test DEBUG:debug:
If you want you can probably avoid this kind of behaviour writing a real
write function that calls
the_logger.debug only with "full lines".
Anyway I think these kind of solution should only be temporary, and be used only before porting the
(Obviously the loggers should write to a file and not to
stdout to avoid the errors.)