[Pythonmac-SIG] Python based apps woes on MacOs X (was :Re: [Pythoncard-users] Re: PythonCard on OS X 10.4 with Python 2.4.1)

Ronald Oussoren ronaldoussoren at mac.com
Sun Sep 4 11:17:41 CEST 2005


On 3-sep-2005, at 14:38, Alex Tweedly wrote:

> catonano at inwind.it wrote:
>> Yes, Alex, you're right. It was a supposed bug when I opened the  
>> thread, so the subject line was quite good at the moment.
>> Later it became a bit obscure ;-)
> OK - as long as you didn't think anyone was doubting that it was a  
> bug ....
>>> Something appears to have changed wrt the path that Python's  
>>> sys.modules reports for imported files.
>>> As far as I know, no-one has yet verified for sure whether it is  
>>> a Python bug or merely a platform-specific change that Pythoncard  
>>> will need to adjust for. (Nor do I know how we'll be able to  
>>> adjust - but I'm hoping that some of the PythonCard / Mac users  
>>> are investigating ....)
>> That python user could be me ! Alex, would you discuss a bit more  
>> about this Python issue ?
> Sure, I'll talk about it some, and maybe try to distill it down to  
> a simple small program that would be easy to try out.
> But first I'll give a few disclaimers.
>  - I was totally unaware of this part of the code until this topic  
> came up
>  - I'm not a Python details kind of guy
>  - I don't have, or have access to, a Mac
>
> (So if Kevin has to come along and correct anything I say - don't  
> be too surprised).
>> sys.modules reportings about the imported files has changed ?  
>> Since when ? Does this affect the Apple installed python or the  
>> "third parties" ones ?
> No real idea since when. First guess would be between Python  
> 2.3.something and Python 2.4.something.
>
> I have a vague idea that Apple installed python is 2.3, so it  
> shouldn't be affected (but that's only a guess).
>
> The issue is how PythonCard finds the resource files that go along  
> with a Python source file. By default, they live in the same  
> directory as the source file, and have an extra ".rsrc" appended to  
> the base name (before the extension) - thus a source file xyz.py  
> would have a resource file xyz.rsrc.py
>
> PythonCard allows for various alternatives (language specific  
> resource files, platform specific files, no file but an internal  
> dictionary, etc.) and these make the code somewhat harder to  
> follow. But if you ignore all those, the essence of what PythonCard  
> does is
>
> 1. determine the full path name for the source file
> 2. modify it as above
> 3. read and eval() the resource file.
>
> In this case, the source file is not the application itself, but an  
> imported module. In the resourceEditor (in resourceEditor.py, in  
> fact), we do
>
> (before Kevin's suggested modification)
> from modules.propertyEditor import PropertyEditor
> ....
>         self.propertyEditorWindow = model.childWindow(self,  
> PropertyEditor)
>
> (or, after Kevin's suggested modification)
> from modules import propertyEditor
> ....
>         self.propertyEditorWindow = model.childWindow(self,  
> propertyEditor.PropertyEditor)
>
> (modules is a subdirectory within resourceEditor, propertyEditor.py  
> is a source file, PropertyEditor is a class within that file).
>
> So these two should be equivalent; Kevin suggested the change  
> because this is the only place within PythonCard that this form of  
> import is used - every other import is the second form (and there  
> was some hope that this change would help).
>
> I'll use the second version in this example below .... and probably  
> get some of the terminology wrong.
>
> When you call model.childWindow, you pass in the class you want -  
> i.e. propertyEditor.PropertyEditor
> childWindow() then derives the filename, splits off the extension,  
> adds in the .rsrc.py and tries to read that file (remember I'm  
> skipping over the internationalization part ...)
>
> So it does  [ frameClass is the class wanted ]
>
>                 filename = sys.modules[frameClass.__module__].__file__
> .....
>             base, ext = os.path.splitext(filename)
>             filename = internationalResourceName(base)
>             rsrc = resource.ResourceFile(filename).getResource()

I haven't followed this discusion upto now, but do you use py2app to  
build the application bundle on OSX? py2app places all .py/.pyc files  
into a zip file, resources are outside of the zip file.

BTW. do you know about setuptools? It contains a generic API for  
dealing with resource files.

>
>
> So - that's the background.
>
> Brad sent the debug output from the first case above (before  
> Kevin's suggested change), and also reported that the problem  
> persisted after the change. So it looks likely that it's a Python  
> bug. The Python docs are very sparse on what sys.modules should do.

I'd say it is unlikely to be a bug in Python :-)

>
> I'd like to see a simple test output which is independent of  
> PythonCard.
>
> 1. Create a test directory
>      mine is called C:/python/projects/modulestest
>
> 2. create a subdirectory called "mmm"  (calling it "modules" was  
> confusing me)
>
> 3. create a file within that subdirectory called   myFile.py    
> containing
>> class myClass:
>>     def init():
>>         pass
> 4. create another tile in that subdirectory (to make it a package)  
> called __init__.py containing
>> # turn modules into a package
> (note the name is underscore underscore i n i t underscore  
> underscore . p y )
>
> 5. cd to the main test directory
>> cd c:\python\projects\modulestest
> 6. run python, and do
>> import sys
>> from mmm import myFile
>> myFile.myClass.__module__
>> sys.modules[myFile.myClass.__module__].__file__
> and see what the output is.

For what it's worth:

Python 2.3.5 (#1, Mar 20 2005, 20:38:20)
[GCC 3.3 20030304 (Apple Computer, Inc. build 1809)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
 >>> import sys
 >>> from mmm import myFile
 >>> myFile.myClass.__module__
'mmm.myFile'
 >>> myFile.__file__
'mmm/myFile.pyc'
 >>> sys.modules[myFile.myClass.__module__].__file__
'mmm/myFile.pyc'

and:
Python 2.4.1 (#1, Aug 23 2005, 21:38:15)
[GCC 4.0.0 (Apple Computer, Inc. build 5026)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
 >>> import sys
 >>> from mmm import myFile
 >>> myFile.myClass.__module__
'mmm.myFile'
 >>> myFile.__file__
'mmm/myFile.py'
 >>> sys.modules[myFile.myClass.__module__].__file__
'mmm/myFile.py'



>
> It *should* be the path name to the file ....
> <screen.PNG>
>
>
>
> This gives the same result on Python 2.4.1 on Windows.
> I'd like to see the equivalent of this on each of Python 2.3 and  
> 2.4 on Mac.
>
> Then we'd know what the next step might be ... :-)
>
> -- Alex Tweedly http://www.tweedly.net
> <screen.PNG>
> No virus found in this outgoing message.
> Checked by AVG Anti-Virus.
> Version: 7.0.344 / Virus Database: 267.10.18/86 - Release Date:  
> 31/08/2005
> _______________________________________________
> Pythonmac-SIG maillist  -  Pythonmac-SIG at python.org
> http://mail.python.org/mailman/listinfo/pythonmac-sig
>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2105 bytes
Desc: not available
Url : http://mail.python.org/pipermail/pythonmac-sig/attachments/20050904/0927b748/smime.bin


More information about the Pythonmac-SIG mailing list