[Pythonmac-SIG] PIL and Snow Leopard

Jerry LeVan jerry.levan at eku.edu
Mon Oct 5 03:07:56 CEST 2009



>
>>>
>>> On Oct 2, 2009, at 7:40 PM, Bill Janssen wrote:
>>>
>>>> Jerry LeVan <jerry.levan at eku.edu> wrote:
>>>>
>>>>> Is building PIL on Snow Leopard 'easy' I have the apple python
>>>>> (32/64)
>>>>> installed and the python.org 2.6.2 (32 bit) version installed.
>>>>
>>>> Yes, I just build it with /usr/bin/python, and it works fine.
>>>> Assuming
>>>> you have Xcode 3.2 installed.
>>>>
>>>> Bill
>>>
>>> Ugh, this is getting messy...
>>>
>>> I think that I have built libfreetype.dylib and libjpeg.dylib as
>>> i386 and x86_64 libs...at least that is what the file command  
>>> asserts.
>>>
>>> I then built the PIL package using the system python in 64 bit  
>>> mode and
>>> installed the rascal in the Apple python. All of the libs appear  
>>> to be
>>> multi-architecture ppc, i386 and x86_64
>>>
>>> When I run apple python in 64 bit mode I can run the PIL demos...
>>>
>>> If I restrict apple python to 32 bit mode all of the programs fail
>>> with a bus error.
>>>
>>> *********
>>>
>>> I then tried to build PIL using the 2.6.2 python from python.org.
>>> 1) It would not build under gcc-4.2 I had to define CC=gcc-4.0
>>>     the build appeared to succeed and I installed the PIL system.
>>> 2) All of the demos failed...
>>>
>>> I noticed that _imagingtk.so was dynamically linked against
>>> the ActiveState Tcl/Tk that is installed in /Library/Frameworks/
>>> Tcl.framework
>>>
>>> [mbp:/Library/Python/2.6/site-packages/PIL]$ otool -L _imagingtk.so
>>> _imagingtk.so:
>>> 	/Library/Frameworks/Tcl.framework/Versions/8.5/Tcl (compatibility
>>> version 8.5.0, current version 8.5.4)
>>> 	/Library/Frameworks/Tk.framework/Versions/8.5/Tk (compatibility
>>> version 8.5.0, current version 8.5.4)
>>> 	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current
>>> version 124.1.1)
>>>
>>> I suppose that I could hide the ActiveState versions by renaming the
>>> Frameworks...
>>>
>>> But even if I did that, how could I force setup.py to use the apple
>>> 8.4 tcl/tk system instead
>>> of the 'current' 8.5 system?
>>>
>>> Any suggestions as to how I can get PIL to work when apple python is
>>> in 32 bit mode?
>>>
>>> Any suggestions as to how I can build PIL using the 2.6.2 version of
>>> Python from python.org?
>>>
>>> This is getting ugly...too many impedance mismatches.
>>>
>>> Jerry
>>>
>>
>> A little more success to report. ..
>>
>> I hid the activestate tcl/tk frameworks in /Library/Frameworks and  
>> set CC to gcc-4.0
>> and rebuilt PIL and otool showed that _imagingtk.so was linked  
>> against the apple 8.4
>> Tcl/Tk system.
>>
>> So I installed the build and "tada" Imaging appears to be working  
>> in python.org version
>> of python (2.6.2).
>>
>> So this leaves only the "why does apple python (2.6.1) not work  
>> when run in 32 bit mode
>> but does in 64 bit mode"  question open...
>>
>> Has anyone had success with PIL in this case?
>>
>> Thanks
>>
>> Jerry
>
> When I run the Apple Python in 32  bit mode I get a bus error at the  
> same place when I try
> to display an image using PIL .  Here is part of the dump.
>
> Exception Type:  EXC_BAD_ACCESS (SIGBUS)
> Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000028
> Crashed Thread:  0  Dispatch queue: com.apple.main-thread
>
> Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
> 0   com.tcltk.tklibrary           	0x13a1850b Tk_GetImageMasterData  
> + 17
> 1   com.tcltk.tklibrary           	0x13a20cab Tk_FindPhoto + 37
> 2   _imagingtk.so                 	0x007faacf PyImagingPhotoPut + 95
> 3   com.tcltk.tcllibrary          	0x138d3d64 TclInvokeStringCommand  
> + 101
> 4   com.tcltk.tcllibrary          	0x00489977 Tcl_CreateInterp + 4919
> 5   com.tcltk.tcllibrary          	0x0048a96c Tcl_EvalObjv + 72
> 6   _tkinter.so                   	0x001e449d Tkapp_CallDeallocArgs  
> + 11750
> 7   org.python.python             	0x0008b372 PyEval_EvalFrameEx +  
> 16375
> 8   org.python.python             	0x0008cf64 PyEval_EvalCodeEx + 1720
> 9   org.python.python             	0x0008b591 PyEval_EvalFrameEx +  
> 16918
> 10  org.python.python             	0x0008cf64 PyEval_EvalCodeEx + 1720
> 11  org.python.python             	0x0002ee2c PyClassMethod_New + 1823
> 12  org.python.python             	0x0000c700 PyObject_Call + 101
> 13  org.python.python             	0x0001c12e PyClass_New + 1603
> 14  org.python.python             	0x0000c700 PyObject_Call + 101
> 15  org.python.python             	0x0008677a  
> PyEval_CallObjectWithKeywords + 171
> 16  org.python.python             	0x0001ba58 PyInstance_New + 290
> 17  org.python.python             	0x0000c700 PyObject_Call + 101
> 18  org.python.python             	0x0008c802 PyEval_EvalFrameEx +  
> 21639
> 19  org.python.python             	0x0008cf64 PyEval_EvalCodeEx + 1720
> 20  org.python.python             	0x0002ee2c PyClassMethod_New + 1823
> 21  org.python.python             	0x0000c700 PyObject_Call + 101
> 22  org.python.python             	0x0001c12e PyClass_New + 1603
> 23  org.python.python             	0x0000c700 PyObject_Call + 101
> 24  org.python.python             	0x0008677a  
> PyEval_CallObjectWithKeywords + 171
> 25  org.python.python             	0x0001ba58 PyInstance_New + 290
> 26  org.python.python             	0x0000c700 PyObject_Call + 101
> 27  org.python.python             	0x0008c802 PyEval_EvalFrameEx +  
> 21639
> 28  org.python.python             	0x0008cf64 PyEval_EvalCodeEx + 1720
> 29  org.python.python             	0x0008d009 PyEval_EvalCode + 87
> 30  org.python.python             	0x000a40bb Py_CompileString + 111
> 31  org.python.python             	0x000a4167 PyRun_FileExFlags + 139
> 32  org.python.python             	0x000a5e8a  
> PyRun_SimpleFileExFlags + 814
> 33  org.python.python             	0x000b3168 Py_Main + 3074
> 34  org.python.python.app         	0x00001eb5 start + 53
>
> The crash occurs at the same 'place' every time...
>
> If I run the Apple Python in 64 bit mode or the python.org Python  
> ( 32 bit carbon 2.6.2 )image displaying, ie PIL,  works fine :)
>
> Sorta strange...
>
> Here is a sample program that can be used...
>
> #!/usr/bin/env python
> # Author: Jerry LeVan
> from Tkinter import *
> import Image, ImageTk
> import StringIO
> from tkMessageBox import *
>
> class ShowImage:
> 	
>   def build_scrolled_canvas(self,parent):
>
>      canvas=Canvas(parent)
>
>      sy = Scrollbar(parent, command=canvas.yview)
>      sx = Scrollbar(parent, orient=HORIZONTAL,
>                     command= canvas.xview)
>      canvas.configure(yscrollcommand=sy.set,xscrollcommand=sx.set)
>      canvas.grid(row=0,column=0,sticky=NSEW)
>      sy.grid(row=0,column=1,stick=N+S)
>      sx.grid(row=1,column=0,sticky=E+W)
>      parent.columnconfigure(0,weight=1)
>      parent.rowconfigure(0,weight=1)
>      return canvas
>
>   def __init__(self, theStr):
>     self.theStr = theStr
>     self.theWin = Toplevel()
>     self.theWin.title('Image Viewer')
>     self.theFrame = Frame(self.theWin)
>     self.theCanvas = self.build_scrolled_canvas(self.theFrame)
>     self.theButton= Button 
> (self.theWin,text="Close",command=self.theWin.destroy)
>     self.theFrame.pack(side=TOP, expand=TRUE, fill=BOTH)
>     self.theButton.pack(side=TOP)
>     try:
>          self.im = Image.open(StringIO.StringIO(self.theStr))
>          (width,height) = self.im.size
>          self.tkim = ImageTk.PhotoImage(self.im)
>          self.theCanvas.create_image(0,0,image=self.tkim,anchor=NW)
>          self.theCanvas['scrollregion'] = (0,0,width,height)
>     except Exception, e :
>          showerror(title="Error",message="image problem: "+str(e))
>          self.theWin.destroy()
>
> if __name__ == '__main__':
>     theStr = open(sys.argv[1],'rb').read()
>     thePic = ShowImage(theStr)
>     myPic = ShowImage(theStr)
>     mainloop()
>

Bah, Humbug...

I used otool to peek at _imagetk.so and found that the linker had  
picked up the ActiveState Tcl/tk Frameworks in /Library/Frameworks...

So I hid the active state frameworks for tcl and tk and just to be  
safe I hid the community python from python.org.

I made sure that the Apple Python was in my path and rebuilt PIL. This  
time it appears that  all is well. The Apple frameworks for
Tcl and Tk were picked up :)

I have been able to use PIL to  display images via Apple's Python  
running in 64 or 32 bit mode.

I have a better handle on my WxPython problem...I think I was  
releasing a table for a grid a bit too soon...

Things are starting to look up :)

Jerry
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pythonmac-sig/attachments/20091004/b46701c7/attachment-0001.htm>


More information about the Pythonmac-SIG mailing list