]> granicus.if.org Git - python/commitdiff
Module to help other modules locate their resources. It currently knows about
authorJack Jansen <jack.jansen@cwi.nl>
Mon, 27 Aug 2001 21:21:07 +0000 (21:21 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Mon, 27 Aug 2001 21:21:07 +0000 (21:21 +0000)
resources in applets and separate OS9 style resource files, but it will
eventually also be thought the hoops to jump through on OSX/MachO.

Mac/Lib/macresource.py [new file with mode: 0644]

diff --git a/Mac/Lib/macresource.py b/Mac/Lib/macresource.py
new file mode 100644 (file)
index 0000000..1aabe12
--- /dev/null
@@ -0,0 +1,68 @@
+"""macresource - Locate and open the resources needed for a script."""
+
+from Carbon import Res
+import os
+import sys
+
+class ArgumentError(TypeError): pass
+class ResourceFileNotFoundError(ImportError): pass
+
+def need(restype, resid, filename=None, modname=None):
+       """Open a resource file, if needed. restype and resid
+       are required parameters, and identify the resource for which to test. If it
+       is available we are done. If it is not available we look for a file filename
+       (default: modname with .rsrc appended) either in the same folder as
+       where modname was loaded from, or otherwise across sys.path."""
+
+       if modname is None and filename is None:
+               raise ArgumentError, "Either filename or modname argument (or both) must be given"
+       
+       if type(resid) is type(1):
+               try:
+                       h = Res.GetResource(restype, resid)
+               except Res.Error:
+                       pass
+               else:
+                       return
+       else:
+               try:
+                       h = Res.GetNamedResource(restype, resid)
+               except Res.Error:
+                       pass
+               else:
+                       return
+                       
+       # Construct a filename if we don't have one
+       if not filename:
+               if '.' in modname:
+                       filename = modname.split('.')[-1] + '.rsrc'
+               else:
+                       filename = modname + '.rsrc'
+       
+       # Now create a list of folders to search
+       searchdirs = []
+       if modname == '__main__':
+               # If we're main we look in the current directory
+               searchdirs = [os.curdir]
+       if sys.modules.has_key(modname):
+               mod = sys.modules[modname]
+               if hasattr(mod, '__file__'):
+                       searchdirs = [mod.__file__]
+       if not searchdirs:
+               searchdirs = sys.path
+       
+       # And look for the file
+       for dir in searchdirs:
+               pathname = os.path.join(dir, filename)
+               if os.path.exists(pathname):
+                       break
+       else:
+               raise ResourceFileNotFoundError, filename
+       
+       Res.FSpOpenResFile(pathname, 1)
+       
+       # And check that the resource exists now
+       if type(resid) is type(1):
+               h = Res.GetResource(restype, resid)
+       else:
+               h = Res.GetNamedResource(restype, resid)