def ImportFile(): """ This code looks for the current window, and determines if it can be imported. If not, it will prompt for a file name, and allow it to be imported. """ try: pathName = GetActiveFileName() except KeyboardInterrupt: pathName = None if pathName is not None: if os.path.splitext(pathName)[1].lower() not in ('.py','.pyw','.pyx'): pathName = None if pathName is None: openFlags = win32con.OFN_OVERWRITEPROMPT|win32con.OFN_FILEMUSTEXIST dlg = win32ui.CreateFileDialog(1,None,None,openFlags, "Python Scripts (*.py;*.pyw)|*.py;*.pyw;*.pyx||") dlg.SetOFNTitle("Import Script") if dlg.DoModal()!=win32con.IDOK: return 0 pathName = dlg.GetPathName() # If already imported, dont look for package path, modName = os.path.split(pathName) modName, modExt = os.path.splitext(modName) newPath = None # note that some packages (*cough* email *cough*) use "lazy importers" # meaning sys.modules can change as a side-effect of looking at # module.__file__ - so we must take a copy (ie, items() in py2k, # list(items()) in py3k) for key, mod in list(sys.modules.items()): if hasattr(mod, '__file__'): fname = mod.__file__ base, ext = os.path.splitext(fname) if ext.lower() in ['.pyo', '.pyc']: ext = '.py' fname = base + ext if win32ui.ComparePath(fname, pathName): modName = key break else: # for not broken modName, newPath = GetPackageModuleName(pathName) if newPath: sys.path.append(newPath) if modName in sys.modules: bNeedReload = 1 what = "reload" else: what = "import" bNeedReload = 0 win32ui.SetStatusText(what.capitalize()+'ing module...',1) win32ui.DoWaitCursor(1) # win32ui.GetMainFrame().BeginWaitCursor() try: # always do an import, as it is cheap if it's already loaded. This ensures # it is in our name space. codeObj = compile('import '+modName,'<auto import>','exec') except SyntaxError: win32ui.SetStatusText('Invalid filename for import: "' +modName+'"') return try: exec(codeObj, __main__.__dict__) mod = sys.modules.get(modName) if bNeedReload: try: ## The interpreter sees this import as a local assignment, so Python 2.x throws ## UnboundLocalError: local variable 'reload' referenced before assignment ## when you try to use reload after this fails from imp import reload as my_reload # py3k except ImportError: my_reload = reload # reload a builtin in py2k mod = my_reload(sys.modules[modName]) win32ui.SetStatusText('Successfully ' + what + "ed module '"+modName+"': %s" % getattr(mod,'__file__',"<unkown file>")) except: _HandlePythonFailure(what) win32ui.DoWaitCursor(0)
def ImportFile(): """ This code looks for the current window, and determines if it can be imported. If not, it will prompt for a file name, and allow it to be imported. """ try: pathName = GetActiveFileName() except KeyboardInterrupt: pathName = None if pathName is not None: if os.path.splitext(pathName)[1].lower() not in ('.py','.pyw','.pyx'): pathName = None if pathName is None: openFlags = win32con.OFN_OVERWRITEPROMPT|win32con.OFN_FILEMUSTEXIST dlg = win32ui.CreateFileDialog(1,None,None,openFlags, "Python Scripts (*.py;*.pyw)|*.py;*.pyw;*.pyx||") dlg.SetOFNTitle("Import Script") if dlg.DoModal()!=win32con.IDOK: return 0 pathName = dlg.GetPathName() # If already imported, dont look for package path, modName = os.path.split(pathName) modName, modExt = os.path.splitext(modName) newPath = None # note that some packages (*cough* email *cough*) use "lazy importers" # meaning sys.modules can change as a side-effect of looking at # module.__file__ - so we must take a copy (ie, items() in py2k, # list(items()) in py3k) for key, mod in sys.modules.items(): if hasattr(mod, '__file__'): fname = mod.__file__ base, ext = os.path.splitext(fname) if ext.lower() in ['.pyo', '.pyc']: ext = '.py' fname = base + ext if win32ui.ComparePath(fname, pathName): modName = key break else: # for not broken modName, newPath = GetPackageModuleName(pathName) if newPath: sys.path.append(newPath) if modName in sys.modules: bNeedReload = 1 what = "reload" else: what = "import" bNeedReload = 0 win32ui.SetStatusText(what.capitalize()+'ing module...',1) win32ui.DoWaitCursor(1) # win32ui.GetMainFrame().BeginWaitCursor() try: # always do an import, as it is cheap if it's already loaded. This ensures # it is in our name space. codeObj = compile('import '+modName,'<auto import>','exec') except SyntaxError: win32ui.SetStatusText('Invalid filename for import: "' +modName+'"') return try: exec codeObj in __main__.__dict__ mod = sys.modules.get(modName) if bNeedReload: try: ## The interpreter sees this import as a local assignment, so Python 2.x throws ## UnboundLocalError: local variable 'reload' referenced before assignment ## when you try to use reload after this fails from imp import reload as my_reload # py3k except ImportError: my_reload = reload # reload a builtin in py2k mod = my_reload(sys.modules[modName]) win32ui.SetStatusText('Successfully ' + what + "ed module '"+modName+"': %s" % getattr(mod,'__file__',"<unkown file>")) except: _HandlePythonFailure(what) win32ui.DoWaitCursor(0)