[Pythonmac-SIG] Re: [pygame] python + pygame on OSX

Bob Ippolito bob at redivi.com
Mon Feb 23 11:47:13 EST 2004


On Feb 23, 2004, at 4:02 AM, Jack Jansen wrote:

>
> On 23-feb-04, at 0:24, Bob Ippolito wrote:
>> I saw a system for including package resources (name eludes me at the 
>> moment) by converting the binaries to python code.. so that the 
>> resources ended up being Python strings(!!) on import.. I don't think 
>> this is a general solution, and it probably has the capability to 
>> increases memory consumption and load time considerably, but it 
>> *would* work as a hack ;)
>
> Brrrr :-)
>
>> In any case, would anyone like to implement this?  I am probably too 
>> busy to get around to it for a few weeks (and I honestly don't really 
>> want to write it), but I would be probably integrate it into 
>> bundlebuilder2 sooner than that if it sprung into existence.
>
> Implementation is going to be peanuts, design is what we want.
> We should investigate the paradigms people use nowadays to get at 
> their datafiles, and come up with something that is as close as 
> possible to that.
>
> How does pygame find its datafiles?

pygame actually does it in a C extension when it's looking for its font 
file.. so it's not really typical usage.  I will change pygame 
accordingly when method exists.

In most cases, I've seen os.path.join(os.path.dirname(__file__), 
"resourcefile") -- maybe with an app-specific fallback if they have 
baked in support for py2exe.

The more I think about it, the more I just want to recommend that the 
implementation use PyProtocols or something so that it's flexible.

<this is untested>
# bundlebuilder bootstrap
from protocols import protocolForURI, Adapter, advise, NO_ADAPTER_NEEDED
from Foundation import NSBundle
#
# use a URI protocol so that
# (a) an implementation doesn't have to exist
# (b) the user doesn't have to import it
#
IReadableFileLike = 
protocolForURI("org.python.packaging.readablefilelike")
declareAdapter(NO_ADAPTER_NEEDED, provides=[IReadableFileLike], 
forTypes=[file])

def bundlebuilderFile(obj, protocol):
     """Loads a (module, filename) 2-tuple from 
Contents/Resources/ModuleData/%(moduleName)s/%(fileName)s"""
     module, filename = obj
     modulename = getattr(module, '__name__', module)
     if not isinstance(modulename, basestring):
         return None
     filepath = os.path.join(NSBundle.mainBundle().resourcePath(), 
'ModuleData', modulename, filename)
     if not os.path.exists(filepath):
         return None
     return file(filepath)

declateAdapterForType(IReadableFileLike, bundlebuilderFile, tuple)

# user code
import sys, os
from protocols import protocolForURI, adapt
IReadableFileLike = 
protocolForURI("org.python.packaging.readablefilelike")
# sensible default method
def defaultFactory((module, filename)):
     basedir = os.path.dirname(sys.modules.get(module, module).__file__)
     return file(os.path.join(basedir, filename))

myResourceFileObj = adapt((__module__, "resourcefilename"), 
IReadableFileLike, factory=defaultFactory)


-bob




More information about the Pythonmac-SIG mailing list