[Pythonmac-SIG] pythonw
Bob Ippolito
bob at redivi.com
Sat Feb 5 19:35:10 CET 2005
On Feb 5, 2005, at 12:08 PM, Chris Fonnesbeck wrote:
> Sorry in advance for what may, in fact, be a naive post, but I am
> trying to figure out the significance of pythonw on OSX. I know that
> you need to run pythonw if you intend to use python programs with
> certain graphical backends, otherwise the UI becomes unresponsive.
> Running idle from the command line, for example, starts an instance of
> idle that is unusable. My question is: why have both python and
> pythonw? When would you ever *not* want user interfaces not to work?
> This problem does not arise on other platforms, does it? Its a bit of
> a hassle, at the moment, to try and figure out when to use one or the
> other. Are there any plans to remove this apparently unnecessary
> dichotomy?
It is not possible to solve this problem without changing the way
Python gets installed (making /usr/bin/python a fork-exec stub or shell
script) or using private Apple SPI (to trick the WindowServer into
doing the right thing).
As far as I know, other platforms do not have this problem.
The details of why this is aren't public because we don't have the
source, however, the basic idea is that in order for the default
WindowServer connection to be created correctly argv[0] needs to point
to the absolute path of the executable, and that executable needs to be
inside of an application bundle. /usr/bin/python is obviously not in
an application bundle, and running "python foo.py" will leave argv[0]
as a relative-to-$PATH path due to the way that the shell works. This
is essentially a bug in the way WindowServer works, which I and others
have filed bugs against, but Apple has neither opened an API to fix
this nor have they fixed the bug in WindowServer.
The best fix that I can come up with is to make the GUI libraries for
Python (Tkinter, wxPython, pygame, PyObjC, ...) hook into the private
Apple SPI in a safe-ish way. In PyObjC proper, this isn't really an
issue because it's not really useful to write PyObjC applications that
aren't already in an application bundle. For the others, it is
arguably useful. I have example code for doing this specific hack in
PyObjC at
<http://svn.red-bean.com/pyobjc/trunk/pyobjc/Examples/Scripts/
wmEnable.py>. I may add this hack to the next release of pygame (which
is especially easy because pygame requires PyObjC), but the authors of
Tk/Tkinter and wxPython are going to have to do it themselves. I have
heard that some future version of Tk (which would directly fix Tkinter)
may include an equivalent hack, but obviously the version of Tk that
does this (if such a version is mainline) isn't very common yet.
For running your own scripts and playing around in the terminal, just
use pythonw all the time. There is a very slight increase in start-up
time, but nothing worth caring about.
-bob
More information about the Pythonmac-SIG
mailing list