Guido van Rossum | 9f42584 | 1999-01-09 05:00:17 +0000 | [diff] [blame] | 1 | """Extension to execute code outside the Python shell window. |
| 2 | |
| 3 | This adds two commands (to the Edit menu, until there's a separate |
| 4 | Python menu): |
| 5 | |
Guido van Rossum | 1f3de5d | 1999-04-22 22:27:40 +0000 | [diff] [blame] | 6 | - Import module (F5) is equivalent to either import or reload of the |
Guido van Rossum | 9f42584 | 1999-01-09 05:00:17 +0000 | [diff] [blame] | 7 | current module. The window must have been saved previously. The |
Guido van Rossum | 1f3de5d | 1999-04-22 22:27:40 +0000 | [diff] [blame] | 8 | module is added to sys.modules, and is also added to the __main__ |
| 9 | namespace. Output goes to the shell window. |
Guido van Rossum | 9f42584 | 1999-01-09 05:00:17 +0000 | [diff] [blame] | 10 | |
Guido van Rossum | 1f3de5d | 1999-04-22 22:27:40 +0000 | [diff] [blame] | 11 | - Run module (Control-F5) does the same but executes the module's |
| 12 | code in the __main__ namespace. |
Guido van Rossum | 9f42584 | 1999-01-09 05:00:17 +0000 | [diff] [blame] | 13 | |
| 14 | """ |
| 15 | |
| 16 | import sys |
Guido van Rossum | 504b0bf | 1999-01-02 21:28:54 +0000 | [diff] [blame] | 17 | import os |
| 18 | import imp |
Guido van Rossum | 9f42584 | 1999-01-09 05:00:17 +0000 | [diff] [blame] | 19 | import tkMessageBox |
Guido van Rossum | 825df2a | 1999-03-29 14:52:28 +0000 | [diff] [blame] | 20 | |
Guido van Rossum | 504b0bf | 1999-01-02 21:28:54 +0000 | [diff] [blame] | 21 | |
| 22 | class ScriptBinding: |
Guido van Rossum | 9f42584 | 1999-01-09 05:00:17 +0000 | [diff] [blame] | 23 | |
| 24 | keydefs = { |
Guido van Rossum | 1f3de5d | 1999-04-22 22:27:40 +0000 | [diff] [blame] | 25 | '<<import-module>>': ['<F5>'], |
| 26 | '<<run-script>>': ['<Control-F5>'], |
Guido van Rossum | 9f42584 | 1999-01-09 05:00:17 +0000 | [diff] [blame] | 27 | } |
| 28 | |
| 29 | menudefs = [ |
| 30 | ('edit', [None, |
Guido van Rossum | 1f3de5d | 1999-04-22 22:27:40 +0000 | [diff] [blame] | 31 | ('Import module', '<<import-module>>'), |
| 32 | ('Run script', '<<run-script>>'), |
Guido van Rossum | 9f42584 | 1999-01-09 05:00:17 +0000 | [diff] [blame] | 33 | ] |
| 34 | ), |
| 35 | ] |
Guido van Rossum | 504b0bf | 1999-01-02 21:28:54 +0000 | [diff] [blame] | 36 | |
| 37 | def __init__(self, editwin): |
| 38 | self.editwin = editwin |
Guido van Rossum | 9f42584 | 1999-01-09 05:00:17 +0000 | [diff] [blame] | 39 | # Provide instance variables referenced by Debugger |
| 40 | # XXX This should be done differently |
| 41 | self.flist = self.editwin.flist |
| 42 | self.root = self.flist.root |
Guido van Rossum | 504b0bf | 1999-01-02 21:28:54 +0000 | [diff] [blame] | 43 | |
Guido van Rossum | 1f3de5d | 1999-04-22 22:27:40 +0000 | [diff] [blame] | 44 | def import_module_event(self, event): |
| 45 | filename = self.getfilename() |
| 46 | if not filename: |
| 47 | return |
| 48 | |
| 49 | modname, ext = os.path.splitext(os.path.basename(filename)) |
| 50 | if sys.modules.has_key(modname): |
| 51 | mod = sys.modules[modname] |
| 52 | else: |
| 53 | mod = imp.new_module(modname) |
| 54 | sys.modules[modname] = mod |
| 55 | mod.__file__ = filename |
| 56 | setattr(sys.modules['__main__'], modname, mod) |
| 57 | |
| 58 | dir = os.path.dirname(filename) |
| 59 | dir = os.path.normpath(os.path.abspath(dir)) |
| 60 | if dir not in sys.path: |
| 61 | sys.path.insert(0, dir) |
| 62 | |
| 63 | flist = self.editwin.flist |
| 64 | shell = flist.open_shell() |
| 65 | interp = shell.interp |
| 66 | interp.runcode("reload(%s)" % modname) |
| 67 | |
| 68 | def run_script_event(self, event): |
| 69 | filename = self.getfilename() |
| 70 | if not filename: |
| 71 | return |
| 72 | |
| 73 | flist = self.editwin.flist |
| 74 | shell = flist.open_shell() |
| 75 | interp = shell.interp |
| 76 | interp.execfile(filename) |
| 77 | |
| 78 | def getfilename(self): |
| 79 | # Logic to make sure we have a saved filename |
Guido van Rossum | 9f42584 | 1999-01-09 05:00:17 +0000 | [diff] [blame] | 80 | if not self.editwin.get_saved(): |
| 81 | tkMessageBox.showerror("Not saved", |
| 82 | "Please save first!", |
| 83 | master=self.editwin.text) |
| 84 | self.editwin.text.focus_set() |
| 85 | return |
Guido van Rossum | 504b0bf | 1999-01-02 21:28:54 +0000 | [diff] [blame] | 86 | filename = self.editwin.io.filename |
| 87 | if not filename: |
| 88 | tkMessageBox.showerror("No file name", |
| 89 | "This window has no file name", |
| 90 | master=self.editwin.text) |
Guido van Rossum | 9f42584 | 1999-01-09 05:00:17 +0000 | [diff] [blame] | 91 | self.editwin.text.focus_set() |
Guido van Rossum | 504b0bf | 1999-01-02 21:28:54 +0000 | [diff] [blame] | 92 | return |
Guido van Rossum | 1f3de5d | 1999-04-22 22:27:40 +0000 | [diff] [blame] | 93 | return filename |