[Tutor] RE...Quest from PRJoshi [fixing IDLE]

Danny Yoo dyoo@hkn.eecs.berkeley.edu
Sat, 29 Dec 2001 12:03:27 -0800 (PST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--545280650-578560010-1009656207=:13114
Content-Type: TEXT/PLAIN; charset=US-ASCII

On Sat, 29 Dec 2001, Pravin Raj Joshi wrote:

> I have both the files in the following path:
> c:\python\nepali_converter\ When I compile them from outside Idle
> (using command-line interpreter) they work perfect, but from inside
> Idle here is the message I get and the program fails. I am using the
> one that comes with Python 2.2.
> 
> #------------------------------------------------------
> >>>
> Traceback (most recent call last):
>   File "C:\Python\nepali_converter\test.py", line 2, in ?
>     from trailabout import abouttrail
> ImportError: No module named trailabout


Ok, I just checked this out.  Nothing's wrong with your program.  
Instead, this feels like an IDLE bug to me.  Try "Import Module" instead
--- it's right next to the Run Script command in the window.  It appears
to behave more nicely.  I wonder why?  Let me check on this...


Hmmm...*shuffle shuffle* .... Ah!  The problem is that "Run Script" uses
Python's 'execfile()' function to run a script.  The bug is that IDLE
doesn't add "C:\Python\nepali_converter" to the sys.path directory list.
What this means is that when your file tries to import 'abouttrail', IDLE
has no clue where to find it.


IDLE is itself written in Python, so if we feel brave, we can fix this
problem if we're willing to look at the source.  The file
'ScriptBinding.py' within the IDLE directory has a function called
"run_script_event()" which does the work when we "Run Script".  Take a
look:

###
    def run_script_event(self, event):
        filename = self.getfilename()
        if not filename:
            return

        flist = self.editwin.flist
        shell = flist.open_shell()
        interp = shell.interp
        if (not sys.argv or
            os.path.basename(sys.argv[0]) != os.path.basename(filename)):
            # XXX Too often this discards arguments the user just set...
            sys.argv = [filename]
        interp.execfile(filename)
###


The important part is right at the bottom: it just calls execfile(), but
doesn't fix sys.path before doing this.  A possible fix for this would be
to forcefully set up sys.path to do the right thing:

###
   def run_script_event(self, event):
        filename = self.getfilename()
        if not filename:
            return

        flist = self.editwin.flist
        shell = flist.open_shell()
        interp = shell.interp
        if (not sys.argv or
            os.path.basename(sys.argv[0]) != os.path.basename(filename)):
            # XXX Too often this discards arguments the user just set...
            sys.argv = [filename]
        old_syspath = sys.path[:]
        sys.path.append(os.path.dirname(os.path.abspath(filename)))
        interp.execfile(filename)
        sys.path = old_syspath
###


and this appears to fix the problem.

I've attached the fixed ScriptBinding.py file to this message.  You can
copy this to "C:\Python2.2\Tools\idle" directory (but make a backup copy
of ScriptBinding.py just in case I messed up).  Afterwards, if you restart
IDLE, things should work.  I'll send this message also to the IDLE folks
too and see if they like this approach.


Good luck to you.

--545280650-578560010-1009656207=:13114
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="ScriptBinding.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.21.0112291203270.13114@hkn.eecs.berkeley.edu>
Content-Description: 
Content-Disposition: attachment; filename="ScriptBinding.py"

IiIiRXh0ZW5zaW9uIHRvIGV4ZWN1dGUgY29kZSBvdXRzaWRlIHRoZSBQeXRo
b24gc2hlbGwgd2luZG93Lg0KDQpUaGlzIGFkZHMgdGhlIGZvbGxvd2luZyBj
b21tYW5kcyAodG8gdGhlIEVkaXQgbWVudSwgdW50aWwgdGhlcmUncyBhDQpz
ZXBhcmF0ZSBQeXRob24gbWVudSk6DQoNCi0gQ2hlY2sgbW9kdWxlIChBbHQt
RjUpIGRvZXMgYSBmdWxsIHN5bnRheCBjaGVjayBvZiB0aGUgY3VycmVudCBt
b2R1bGUuDQpJdCBhbHNvIHJ1bnMgdGhlIHRhYm5hbm55IHRvIGNhdGNoIGFu
eSBpbmNvbnNpc3RlbnQgdGFicy4NCg0KLSBJbXBvcnQgbW9kdWxlIChGNSkg
aXMgZXF1aXZhbGVudCB0byBlaXRoZXIgaW1wb3J0IG9yIHJlbG9hZCBvZiB0
aGUNCmN1cnJlbnQgbW9kdWxlLiAgVGhlIHdpbmRvdyBtdXN0IGhhdmUgYmVl
biBzYXZlZCBwcmV2aW91c2x5LiBUaGUNCm1vZHVsZSBpcyBhZGRlZCB0byBz
eXMubW9kdWxlcywgYW5kIGlzIGFsc28gYWRkZWQgdG8gdGhlIF9fbWFpbl9f
DQpuYW1lc3BhY2UuICBPdXRwdXQgZ29lcyB0byB0aGUgc2hlbGwgd2luZG93
Lg0KDQotIFJ1biBtb2R1bGUgKENvbnRyb2wtRjUpIGRvZXMgdGhlIHNhbWUg
YnV0IGV4ZWN1dGVzIHRoZSBtb2R1bGUncw0KY29kZSBpbiB0aGUgX19tYWlu
X18gbmFtZXNwYWNlLg0KDQoiIiINCg0KaW1wb3J0IHN5cw0KaW1wb3J0IG9z
DQppbXBvcnQgaW1wDQppbXBvcnQgdGtNZXNzYWdlQm94DQoNCmluZGVudF9t
ZXNzYWdlID0gIiIiRXJyb3I6IEluY29uc2lzdGVudCBpbmRlbnRhdGlvbiBk
ZXRlY3RlZCENCg0KVGhpcyBtZWFucyB0aGF0IGVpdGhlcjoNCg0KKDEpIHlv
dXIgaW5kZW50YXRpb24gaXMgb3V0cmlnaHQgaW5jb3JyZWN0IChlYXN5IHRv
IGZpeCksIG9yDQoNCigyKSB5b3VyIGluZGVudGF0aW9uIG1peGVzIHRhYnMg
YW5kIHNwYWNlcyBpbiBhIHdheSB0aGF0IGRlcGVuZHMgb24gXA0KaG93IG1h
bnkgc3BhY2VzIGEgdGFiIGlzIHdvcnRoLg0KDQpUbyBmaXggY2FzZSAyLCBj
aGFuZ2UgYWxsIHRhYnMgdG8gc3BhY2VzIGJ5IHVzaW5nIFNlbGVjdCBBbGwg
Zm9sbG93ZWQgXA0KYnkgVW50YWJpZnkgUmVnaW9uIChib3RoIGluIHRoZSBF
ZGl0IG1lbnUpLiIiIg0KDQpjbGFzcyBTY3JpcHRCaW5kaW5nOg0KDQogICAg
a2V5ZGVmcyA9IHsNCiAgICAgICAgJzw8Y2hlY2stbW9kdWxlPj4nOiBbJzxB
bHQtRjU+JywgJzxNZXRhLUY1PiddLA0KICAgICAgICAnPDxpbXBvcnQtbW9k
dWxlPj4nOiBbJzxGNT4nXSwNCiAgICAgICAgJzw8cnVuLXNjcmlwdD4+Jzog
Wyc8Q29udHJvbC1GNT4nXSwNCiAgICB9DQoNCiAgICBtZW51ZGVmcyA9IFsN
CiAgICAgICAgKCdlZGl0JywgW05vbmUsDQogICAgICAgICAgICAgICAgICAo
J0NoZWNrIG1vZHVsZScsICc8PGNoZWNrLW1vZHVsZT4+JyksDQogICAgICAg
ICAgICAgICAgICAoJ0ltcG9ydCBtb2R1bGUnLCAnPDxpbXBvcnQtbW9kdWxl
Pj4nKSwNCiAgICAgICAgICAgICAgICAgICgnUnVuIHNjcmlwdCcsICc8PHJ1
bi1zY3JpcHQ+PicpLA0KICAgICAgICAgICAgICAgICBdDQogICAgICAgICks
DQogICAgXQ0KDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW4pOg0K
ICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luDQogICAgICAgICMgUHJv
dmlkZSBpbnN0YW5jZSB2YXJpYWJsZXMgcmVmZXJlbmNlZCBieSBEZWJ1Z2dl
cg0KICAgICAgICAjIFhYWCBUaGlzIHNob3VsZCBiZSBkb25lIGRpZmZlcmVu
dGx5DQogICAgICAgIHNlbGYuZmxpc3QgPSBzZWxmLmVkaXR3aW4uZmxpc3QN
CiAgICAgICAgc2VsZi5yb290ID0gc2VsZi5mbGlzdC5yb290DQoNCiAgICBk
ZWYgY2hlY2tfbW9kdWxlX2V2ZW50KHNlbGYsIGV2ZW50KToNCiAgICAgICAg
ZmlsZW5hbWUgPSBzZWxmLmdldGZpbGVuYW1lKCkNCiAgICAgICAgaWYgbm90
IGZpbGVuYW1lOg0KICAgICAgICAgICAgcmV0dXJuDQogICAgICAgIGlmIG5v
dCBzZWxmLnRhYm5hbm55KGZpbGVuYW1lKToNCiAgICAgICAgICAgIHJldHVy
bg0KICAgICAgICBpZiBub3Qgc2VsZi5jaGVja3N5bnRheChmaWxlbmFtZSk6
DQogICAgICAgICAgICByZXR1cm4NCg0KICAgIGRlZiB0YWJuYW5ueShzZWxm
LCBmaWxlbmFtZSk6DQogICAgICAgIGltcG9ydCB0YWJuYW5ueQ0KICAgICAg
ICBpbXBvcnQgdG9rZW5pemUNCiAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUs
ICdyJykNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgdGFibmFubnkucHJv
Y2Vzc190b2tlbnModG9rZW5pemUuZ2VuZXJhdGVfdG9rZW5zKGYucmVhZGxp
bmUpKQ0KICAgICAgICBleGNlcHQgdG9rZW5pemUuVG9rZW5FcnJvciwgbXNn
Og0KICAgICAgICAgICAgc2VsZi5lcnJvcmJveCgiVG9rZW4gZXJyb3IiLA0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9rZW4gZXJyb3I6XG4lcyIg
JSBzdHIobXNnKSkNCiAgICAgICAgICAgIHJldHVybiAwDQogICAgICAgIGV4
Y2VwdCB0YWJuYW5ueS5OYW5ueU5hZywgbmFnOg0KICAgICAgICAgICAgIyBU
aGUgZXJyb3IgbWVzc2FnZXMgZnJvbSB0YWJuYW5ueSBhcmUgdG9vIGNvbmZ1
c2luZy4uLg0KICAgICAgICAgICAgc2VsZi5lZGl0d2luLmdvdG9saW5lKG5h
Zy5nZXRfbGluZW5vKCkpDQogICAgICAgICAgICBzZWxmLmVycm9yYm94KCJU
YWIvc3BhY2UgZXJyb3IiLCBpbmRlbnRfbWVzc2FnZSkNCiAgICAgICAgICAg
IHJldHVybiAwDQogICAgICAgIHJldHVybiAxDQoNCiAgICBkZWYgY2hlY2tz
eW50YXgoc2VsZiwgZmlsZW5hbWUpOg0KICAgICAgICBmID0gb3BlbihmaWxl
bmFtZSwgJ3InKQ0KICAgICAgICBzb3VyY2UgPSBmLnJlYWQoKQ0KICAgICAg
ICBmLmNsb3NlKCkNCiAgICAgICAgaWYgJ1xyJyBpbiBzb3VyY2U6DQogICAg
ICAgICAgICBpbXBvcnQgcmUNCiAgICAgICAgICAgIHNvdXJjZSA9IHJlLnN1
YihyIlxyXG4iLCAiXG4iLCBzb3VyY2UpDQogICAgICAgIGlmIHNvdXJjZSBh
bmQgc291cmNlWy0xXSAhPSAnXG4nOg0KICAgICAgICAgICAgc291cmNlID0g
c291cmNlICsgJ1xuJw0KICAgICAgICB0cnk6DQogICAgICAgICAgICBjb21w
aWxlKHNvdXJjZSwgZmlsZW5hbWUsICJleGVjIikNCiAgICAgICAgZXhjZXB0
IChTeW50YXhFcnJvciwgT3ZlcmZsb3dFcnJvciksIGVycjoNCiAgICAgICAg
ICAgIHRyeToNCiAgICAgICAgICAgICAgICBtc2csIChlcnJvcmZpbGVuYW1l
LCBsaW5lbm8sIG9mZnNldCwgbGluZSkgPSBlcnINCiAgICAgICAgICAgICAg
ICBpZiBub3QgZXJyb3JmaWxlbmFtZToNCiAgICAgICAgICAgICAgICAgICAg
ZXJyLmFyZ3MgPSBtc2csIChmaWxlbmFtZSwgbGluZW5vLCBvZmZzZXQsIGxp
bmUpDQogICAgICAgICAgICAgICAgICAgIGVyci5maWxlbmFtZSA9IGZpbGVu
YW1lDQogICAgICAgICAgICBleGNlcHQ6DQogICAgICAgICAgICAgICAgbGlu
ZW5vID0gTm9uZQ0KICAgICAgICAgICAgICAgIG1zZyA9ICIqKiogIiArIHN0
cihlcnIpDQogICAgICAgICAgICBpZiBsaW5lbm86DQogICAgICAgICAgICAg
ICAgc2VsZi5lZGl0d2luLmdvdG9saW5lKGxpbmVubykNCiAgICAgICAgICAg
IHNlbGYuZXJyb3Jib3goIlN5bnRheCBlcnJvciIsDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICJUaGVyZSdzIGFuIGVycm9yIGluIHlvdXIgcHJvZ3Jh
bTpcbiIgKyBtc2cpDQogICAgICAgIHJldHVybiAxDQoNCiAgICBkZWYgaW1w
b3J0X21vZHVsZV9ldmVudChzZWxmLCBldmVudCk6DQogICAgICAgIGZpbGVu
YW1lID0gc2VsZi5nZXRmaWxlbmFtZSgpDQogICAgICAgIGlmIG5vdCBmaWxl
bmFtZToNCiAgICAgICAgICAgIHJldHVybg0KDQogICAgICAgIG1vZG5hbWUs
IGV4dCA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShmaWxl
bmFtZSkpDQogICAgICAgIGlmIHN5cy5tb2R1bGVzLmhhc19rZXkobW9kbmFt
ZSk6DQogICAgICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1ttb2RuYW1lXQ0K
ICAgICAgICBlbHNlOg0KICAgICAgICAgICAgbW9kID0gaW1wLm5ld19tb2R1
bGUobW9kbmFtZSkNCiAgICAgICAgICAgIHN5cy5tb2R1bGVzW21vZG5hbWVd
ID0gbW9kDQogICAgICAgIG1vZC5fX2ZpbGVfXyA9IGZpbGVuYW1lDQogICAg
ICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbJ19fbWFpbl9fJ10sIG1vZG5hbWUs
IG1vZCkNCg0KICAgICAgICBkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZmlsZW5h
bWUpDQogICAgICAgIGRpciA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5h
YnNwYXRoKGRpcikpDQogICAgICAgIGlmIGRpciBub3QgaW4gc3lzLnBhdGg6
DQogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgZGlyKQ0KDQogICAg
ICAgIGZsaXN0ID0gc2VsZi5lZGl0d2luLmZsaXN0DQogICAgICAgIHNoZWxs
ID0gZmxpc3Qub3Blbl9zaGVsbCgpDQogICAgICAgIGludGVycCA9IHNoZWxs
LmludGVycA0KICAgICAgICBpbnRlcnAucnVuY29kZSgicmVsb2FkKCVzKSIg
JSBtb2RuYW1lKQ0KDQogICAgZGVmIHJ1bl9zY3JpcHRfZXZlbnQoc2VsZiwg
ZXZlbnQpOg0KICAgICAgICBmaWxlbmFtZSA9IHNlbGYuZ2V0ZmlsZW5hbWUo
KQ0KICAgICAgICBpZiBub3QgZmlsZW5hbWU6DQogICAgICAgICAgICByZXR1
cm4NCg0KICAgICAgICBmbGlzdCA9IHNlbGYuZWRpdHdpbi5mbGlzdA0KICAg
ICAgICBzaGVsbCA9IGZsaXN0Lm9wZW5fc2hlbGwoKQ0KICAgICAgICBpbnRl
cnAgPSBzaGVsbC5pbnRlcnANCiAgICAgICAgaWYgKG5vdCBzeXMuYXJndiBv
cg0KICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkg
IT0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpOg0KICAgICAgICAgICAg
IyBYWFggVG9vIG9mdGVuIHRoaXMgZGlzY2FyZHMgYXJndW1lbnRzIHRoZSB1
c2VyIGp1c3Qgc2V0Li4uDQogICAgICAgICAgICBzeXMuYXJndiA9IFtmaWxl
bmFtZV0NCiAgICAgICAgb2xkX3N5c3BhdGggPSBzeXMucGF0aFs6XQ0KICAg
ICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5kaXJuYW1lKG9zLnBhdGgu
YWJzcGF0aChmaWxlbmFtZSkpKQ0KICAgICAgICBpbnRlcnAuZXhlY2ZpbGUo
ZmlsZW5hbWUpDQogICAgICAgIHN5cy5wYXRoID0gb2xkX3N5c3BhdGgNCg0K
ICAgIGRlZiBnZXRmaWxlbmFtZShzZWxmKToNCiAgICAgICAgIyBMb2dpYyB0
byBtYWtlIHN1cmUgd2UgaGF2ZSBhIHNhdmVkIGZpbGVuYW1lDQogICAgICAg
ICMgWFhYIEJldHRlciBsb2dpYyB3b3VsZCBvZmZlciB0byBzYXZlIQ0KICAg
ICAgICBpZiBub3Qgc2VsZi5lZGl0d2luLmdldF9zYXZlZCgpOg0KICAgICAg
ICAgICAgbmFtZSA9IChzZWxmLmVkaXR3aW4uc2hvcnRfdGl0bGUoKSBvcg0K
ICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXR3aW4ubG9uZ190aXRsZSgp
IG9yDQogICAgICAgICAgICAgICAgICAgICJVbnRpdGxlZCIpDQogICAgICAg
ICAgICBzZWxmLmVycm9yYm94KCJOb3Qgc2F2ZWQiLA0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAiVGhlIGJ1ZmZlciBmb3IgJXMgaXMgbm90IHNhdmVk
LlxuIiAlIG5hbWUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxl
YXNlIHNhdmUgaXQgZmlyc3QhIikNCiAgICAgICAgICAgIHNlbGYuZWRpdHdp
bi50ZXh0LmZvY3VzX3NldCgpDQogICAgICAgICAgICByZXR1cm4NCiAgICAg
ICAgZmlsZW5hbWUgPSBzZWxmLmVkaXR3aW4uaW8uZmlsZW5hbWUNCiAgICAg
ICAgaWYgbm90IGZpbGVuYW1lOg0KICAgICAgICAgICAgc2VsZi5lcnJvcmJv
eCgiTm8gZmlsZSBuYW1lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAg
IlRoaXMgd2luZG93IGhhcyBubyBmaWxlIG5hbWUiKQ0KICAgICAgICAgICAg
cmV0dXJuDQogICAgICAgIHJldHVybiBmaWxlbmFtZQ0KDQogICAgZGVmIGVy
cm9yYm94KHNlbGYsIHRpdGxlLCBtZXNzYWdlKToNCiAgICAgICAgIyBYWFgg
VGhpcyBzaG91bGQgcmVhbGx5IGJlIGEgZnVuY3Rpb24gb2YgRWRpdG9yV2lu
ZG93Li4uDQogICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGUs
IG1lc3NhZ2UsIG1hc3Rlcj1zZWxmLmVkaXR3aW4udGV4dCkNCiAgICAgICAg
c2VsZi5lZGl0d2luLnRleHQuZm9jdXNfc2V0KCkNCg==
--545280650-578560010-1009656207=:13114--