Tag Archives: OS X

Fix the dreaded “Not an image file” MySQL Django error: use VirtualEnv

If you develop Django using MySQL on a Mac, you’ve undoubtedly run into the “Not an image file” error for models with image fields. The problem has to do with JPEG support for Mac OS and how it interacts with Python Imaging Library. Diabolically, once you’ve installed PIL with bad JPEG support it seems impossible to fix.

My solution is to use a virtualenv. virtualenv is a python tool to create an isolated Python interpreter on your system, which allows you to control the installed packages without mussing up your main Python installation. It’s good practice to use a separate virtualenv for each project, and if you use Eclipse you usually want one for each workspace

There are, of course, other solutions to this problem (using PostgreSQL is probably one of them). The instructions here are based on this post on DjangoDays.com.

Prereqs

You’ll need to have xCode installed. Also, if you want to use Eclipse, vlku.com has an excellent screencast that covers everything.

Create a “workspace”

The best place to keep the virtualenv for your Django project is right next to your Django code. Create a directory to hold both. This can be just a plain directory, but if you’re using Eclipse make a new workspace first and complete the following steps in that workspace. If you have existing code, drop it in the root of this folder. For this tutorial let’s call the folder “myworkspace” and your project “myproject”.

Set up a Virtual Environment with –no-site-packages

Use easy_install to get virtualenv.

easy_install virtualenv

Change into the ‘myworkspace’ directory and create a new virtualenv. The key here is to use the –no-site-packages argument, which creates a Python that ignores the system packages already installed. We don’t want anything to come over from the system Python in case you’ve already installed a useless PIL.

python virtualenv.py python --no-site-packages

You now have a fresh, Django- and PIL-less Python interpreter at myworkspace/python/bin/python. The directory structure should now be as follows:

- myworkspace
+ - myproject
+ - python

Install libjpeg (JPEG Support) system wide

Here’s the key to fixing the problem, and where the DjangoDays.com post really saved my butt. Forget the virtualenv for a second, we’re installing JPEG support system wide.

  1. Download JPEG support. This little sucker keeps moving around the internet. I used version 6, which is still available here. The project is maintained my the Independent JPEG Group, who are showing version 8 as of this posting.
  2. Extract the tarball, cd into the resulting folder (in my case, it was called jpeg-6b, and install it with these changes.
    cd jpeg-6b
    cp /usr/share/libtool/config.sub .
    cp /usr/share/libtool/config.guess .
    ./configure –enable-shared
    make
    sudo mkdir -p /usr/local/include
    sudo mkdir -p /usr/local/bin
    sudo mkdir -p /usr/local/lib
    sudo mkdir -p /usr/local/man/man1
    sudo make install

Thanks DjangoDays.com.

Install PIL

Now we’ll install PIL and point it to the correctly installed JPEG Support. This is again lifted from the DjangoDays.com post.

  1. Download the PIL tarball here.
  2. Extract it, cd into the resulting folder, and edit setup.py to change these lines:
    JPEG_ROOT = none
    ZLIB_ROOT = none

    to this:

    JPEG_ROOT = “/usr/local/include”
    ZLIB_ROOT = “/usr/local/include”
  3. Install PIL with these commands:
    python setup.py build_ext -i
    python selftest.py
    sudo python setup.py install

I got 9 errors when I ran selftest.py, but kept going and haven’t seen any indication that the errors are giving me any trouble. Again, thanks DjangoDays.com.

Install Django, MySQL-python, etc.

Here’s a post a did a last year detailing Django installation on Mac OS X. That is, again, not the only way of doing it. The key here is to use the Python interpreter you just created to install Django and all it’s prereqs. You also have a virtualenv specific easy_install. Use it to install any other dependencies.

myworkspace/python/bin/python
myworkspace/python/bin/easy_install

Run your project

I’m skipping a lot of steps (and debugging) here, but assuming you’ve got your project set up correctly you should now be able to cd into the ‘myproject’ directory and run the server with the following command:

../python/bin/python manage.py runserver

As a shortcut, you can set an environment variable in the ‘myworkspace’ directory to map the command ‘python’ to /myworkspace/python/bin/python. Better yet, if you’re using Eclipse, use that Python as you’re interpreter, and configure the debugger to run the command for you.

Can’t start the dev server for a Google App Engine Java project on Snow Leopard?

This one was ruining my afternoon until I came across this post on the Google App Engine Issues page. I was running the command to start the dev server from the Google App Engine Java tutorial in Terminal on OS X 10.6. The process looked like it would start fine, but would then immediately stop (as evidenced by the new terminal line after the success message):

Kevins-iMac:com.google.appengine.eclipse.sdkbundle kevin$ ./appengine-java-sdk/bin/dev_appserver.sh appengine-java-sdk/demos/guestbook/war
2011-03-16 17:06:59.443 java[8217:a07] [Java CocoaComponent compatibility mode]: Enabled
2011-03-16 17:06:59.444 java[8217:a07] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
Mar 16, 2011 9:07:00 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger
Mar 16, 2011 9:07:00 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
INFO: Successfully processed /Applications/eclipse/plugins/com.google.appengine.eclipse.sdkbundle/appengine-java-sdk/demos/guestbook/war/WEB-INF/appengine-web.xml
Mar 16, 2011 9:07:00 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
INFO: Successfully processed /Applications/eclipse/plugins/com.google.appengine.eclipse.sdkbundle/appengine-java-sdk-1.4.2/demos/guestbook/war/WEB-INF/web.xml
Mar 16, 2011 5:07:00 PM com.google.appengine.tools.development.DevAppServerImpl start
INFO: The server is running at http://localhost:8080/
Kevins-iMac:com.google.appengine.eclipse.sdkbundle kevin$      # this is where things start to suck

Long story short, Apple decided to stop maintaining Java on their operating systems. To fix the problem, install the latest version of OpenJDK.

  1. Download this and install it: http://openjdk-osx-build.googlecode.com/files/OpenJDK-1.7-x86_64-20110221.dmg (most recent as of 3/16/11)
  2. Open your Java Preferences by going to Applications -> Utilities -> Java Preferences
  3. Drag the new Java version (Java SE 7) up above any other Java versions listed

After that you should be able to run the server again.

If you want to fix the problem from within Eclipse, check out Comment 14.

Installing Satchmo on Snow Leopard

Django is my framework of choice for non-CMS web applications, and that makes Satchmo my choice for eCommerce. It’s a great library, even if it does have a million dependencies. On the bright side, I’ve used many of it’s dependencies in other projects, so look at installing these as a chance to learn more about Python.

This tutorial is based on the excellent instructions at the Satchmo Project site.

Installing Dependencies

If you’re going to use Satchmo, you’ve of course got to have Django. See my Django installation tutorial.

Remember how I said that I like to keep Libraries in my user folder? Here’s my first official renege. I don’t want to keep up with all these dependencies, so I’m going to allow easy_install to install these libraries in my Python 2.6 SITE-PACKAGES whenever possible.

Installing easy_install

Here are the official instructions, written for the slightly more advanced user. Here’s what I did:

  1. Download the SetupTools Python egg for our version of Python (2.6, the default on Snow Leopard)
  2. Run the egg as a Shell script with the following Terminal command:
    sudo sh /Users/kevin/Downloads/setuptools-0.6c11-py2.6.egg
  3. Type in your password when your asked for it

That’s it. easy_install is installed as a part of setuptools, and you can run it directly from Terminal by typing ‘easy_install’

Installing the other dependencies

These are generally straightforward with easy_install. Use the command below the name of each library to install. Notes included where I ran into trouble.

Pycrypto

easy_install pycrypto

ReportLab

There’s a link to the 2.5 egg on the Satchmo install site, but that doesn’t help us much. Here’s how to get ReportLab for Python 2.6 (you’ll need GCC, which is a part of XCode):

  1. Download the latest ReportLab tarball from the ReportLab site.
  2. Move the tarball into your user folder and un-tar it
  3. cd
    mv Downloads/ReportLab_2_3.tar.gz ReportLab_2_3.tar.gz
    tar xzvf ReportLab_2_3.tar.gz
  4. Move into the new directory and type the following command to install it:
  5. cd ReportLab_2_3
    python setup.py install

After running this I got the following error:

########## SUMMARY INFO #########
################################################
#Attempting install of _rl_accel, sgmlop & pyHnj
#extensions from '/Users/kevin/ReportLab_2_3/src/rl_addons/rl_accel'
################################################
################################################
#Attempting install of _renderPM
#extensions from '/Users/kevin/ReportLab_2_3/src/rl_addons/renderPM'
# installing without freetype no ttf, sorry!
################################################

Not sure what’s going on here, but I’ll ignore this for now.

TRML2PDF

easy_install http://www.satchmoproject.com/snapshots/trml2pdf-1.2.tar.gz

django-registration

easy_install django-registration

PyYAML

easy_install PyYAML

Python Imaging Library (PIL)

sudo easy_install --find-links=http://download.zope.org/distribution PILwoTk

Django-Threaded-Multihost

  1. Download the django-threaded-multihost tarball from GoSatchmo
  2. Move the tarball into your user folder and un-tar it
  3. cd
    mv Downloads/django-threaded-multihost-1.3-2.tar.gz django-threaded-multihost-1.3-2.tar.gz
    tar xzvf django-threaded-multihost-1.3-2.tar.gz
  4. Move into the new directory and type the following command to install it:
  5. cd django-threaded-multihost-1.3-2
    python setup.py install

Django-App-Plugins

  1. This one’s a little funky. We’re going to need a place for this to live. Make a new directory ‘/Users/kevin/src/django/plugins/’
    mkdir ~/src/django/plugins
  2. Move to the new directory and checkout django-app-plugins from Subversion
  3. cd ~/src/django/plugins
    svn checkout http://django-app-plugins.googlecode.com/svn/trunk/ django-app-plugins-read-only
  4. Create a symbolic link to the SITE-PACKAGES directory from django-app-plugins/app_plugins
    cd /Library/Python/2.6/site-packages/
    ln -s /Users/kevin/src/django/plugins/django-app-plugins-read-only/app_plugins .

SORL-Thumbnail

This package is kept in a Mercurial repository. You’ll have to download and install Mercurial. Here’s the Mercurial Installer for Snow Leopard.

  1. Move to your newly created ‘plugins’ directory and checkout SORL-Thumbnail with Mercurial
    cd ~/src/django/plugins
    hg clone https://sorl-thumbnail.googlecode.com/hg/ sorl-thumbnail
  2. Create a symbolic link to your SITE-PACKAGES directory for SORL-Thumbnail
    cd /Library/Python/2.6/site-packages/
    ln -s /Users/kevin/src/django/plugins/sorl-thumbnail/sorl .

signals-ahoy

  1. Move to your newly created ‘plugins’ directory and checkout signals-ahoy with Mercurial
    cd ~/src/django/plugins
    hg clone http://bitbucket.org/bkroeze/django-signals-ahoy/
  2. Create a symbolic link to your SITE-PACKAGES directory for django-signals-ahoy/signals-ahoy
    cd /Library/Python/2.6/site-packages/
    ln -s /Users/kevin/src/django/plugins/django-signals-ahoy/signals_ahoy .

Sphinx

sudo easy_install sphinx

Docutils

sudo easy_install docutils

Installing Satchmo

Still with me? I want to install Satchmo the same way I installed Django. I’ll be installing it in it’s own directory in ‘src’, though it is technically a plugin. I might be using different versions of Satchmo in the future. I also want to be able to browse the source without too much trouble.

  1. Checkout Satchmo into your ‘src’ directory
    cd ~/src
    mdkir satchmo
    cd satchmo
    hg clone http://bitbucket.org/chris1610/satchmo/ satchmo-trunk
  2. Add ‘satchmo-trunk/satchmo/apps’ to your Python path. I did this by adding it to my .bash_profile. Either edit or create yours, in the root your user directory, to include this line:
    export PYTHONPATH="$PYTHONPATH:/Users/kevin/src/satchmo/satchmo-trunk/satchmo/apps"

At this point, Satchmo is installed. You should be able to import Satchmo from the Python 2.6 interpreter:

>>> import satchmo_store

… and you can now run pre-exisiting Satchmo projects on your iMac.

Plone Buildout on Snow Leopard… from the ground up

This is how I got a fresh Plone buildout up and running on my brand new iMac. I’m writing this mostly for my designer buddies here in Nashville, in the hopes that one day they will come to the light and start skinning Plone sites with me. We can dream can’t we?

Major thanks to Brian Gershon (without this blog post it would have taken me until the Ides of March to get through this), and especially Florian Schulze for his buildout that makes Python 2.4 on Snow Leopard a snap.

Step 1: Find Your Mac OS X Install DVD

Okay, if you’re like me, you don’t know where your install DVD is. Unless, of course, you’ve broken the seal on your new Mac less that 24 hours prior.

If you have your Install DVD:

  1. Insert the DVD, open it, and open “Optional Installs”
  2. Double click “Xcode.mpkg”
  3. Let Xcode install on your machine. It took me between 15 and 20 minutes.

If you DON’T have your Install DVD:

  1. Go to http://developer.apple.com/TOOLS/Xcode/
  2. Click “Download Latest Xcode”
  3. Create an ADC membership if you haven’t already (it’s free)
  4. Download the package (it’s a doozy, 2 GB+)
  5. Double click the package file after you’ve downloaded it
  6. Let Xcode install

Once you’ve gone through the install process, open up Terminal by going to Applications -> Utilities (go ahead and drag it to the dock, you’ll need it later). Type ‘gcc’ into Terminal and press Return. You should get something like the following:

i686-apple-darwin10-gcc-4.2.1: no input files

What’s that, you say? Why, that’s your brand new GNU C Compiler telling you it needs an input file before it can do anything! If you see something different, you probably had a problem installing Xcode.

Step 2: Installing Python 2.4 (and other goodies)

As I’m still working in Plone 3, I’ll have to install Python 2.4. SL ships with Pythons 2.5 and 2.6. Usually it’d be easy to install different versions of Python, but according to Brian’s post SL mangles up a Python 2.4 installation. Here come’s Florian’s buildout to the rescue.

NOTE: This installation method is specific to some problems that Snow Leopard had with Python 2.4. Details available here and on Brian’s blog.

To Install Python 2.4 and the rest of the gang:

  1. Open Terminal
  2. Create a new directory called ‘src’ in your home directory by typing in the following command
  3. mkdir src
  4. Move into that directory with this command
  5. cd src
  6. Checkout and run Florian’s buildout with the following commands
  7. svn co http://svn.plone.org/svn/collective/buildout/python/
    cd python
    python bootstrap.py
    bin/buildout

You should now be able to run Python 2.4 by typing the following code into Terminal:

python-2.4/bin/python2.4

That’s the Python2.4 deep inside your user directory. As it stands, you’d have to use the full path to that file to run Python 2.4. Let’s change that.

Symlinking Python 2.4 to the path:

The goal here is to be able to run Python 2.4 by simply typing “python2.4” into the Terminal. To accomplish this:

  1. Change to a directory in your path (I used /usr/bin)
  2. cd /usr/bin
  3. Type in the following command, substituting your username for “kevin”. You’ll have to type in your password, as we’re editing system files here (type carefully!)
  4. sudo ln -s /Users/kevin/src/python/python-2.4/bin/python2.4 python2.4
  5. Go back to your home folder, and try running Python 2.4 without the path
  6. cd ~
    python2.4

If you get a Python 2.4 interpreter (see below), you’re golden.

Python 2.4.6 (#1, Dec 29 2009, 23:33:05)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

While we’re at it, let’s symlink easy_install-2.4 as well. We’ll need this for ZopeSkel:

cd /usr/bin
sudo ln -s /Users/kevin/src/python/python-2.4/bin/easy_install-2.4 easy_install-2.4

If you ever happen to meet Florian Schulze, thank him for this buildout.

Step 3: Creating a Plone 3 Buildout (finally, right?)

To make a buildout, we’re gonna need Paster. To get Paster, we’re gonna need ZopeSkel. Let’s use that newly symlinked easy_install-2.4 to get ’em.

cd ~
easy_install-2.4 -U ZopeSkel

This installs what we need, but again deep in our user directory. A symlinking we will go:

cd /usr/bin
sudo ln -s /Users/kevin/src/python/python-2.4/bin/paster paster-2.4

Notice I named this particular Paster “paster-2.4”. That’s in case we ever install paster for a different version of Python, we’ll know which one is which.

Now let’s pick a home for our buildouts. I like to create a directory called “workspace” next to my “src” directory (sigh… good ol’ Eclipse). Make that directory, and move into it with these commands:

mkdir workspace
cd workspace

To start a new buildout, type the following command:

paster-2.4 create -t plone3_buildout myplone

Paster will ask you a lot of questions, like what version of Plone you want, and which Zope to use. Hit enter to accept all of the defaults. When Paster is done running, go into the directory you just created, bootstrap the buildout, and run buildout with the following commands:

cd myplone
python2.4 bootstrap.py
bin/buildout

If buildout ran without any errors, the last line of the Terminal output will look like this:

Generated interpreter '/Users/kevin/workspace/myplone/bin/zopepy'.

Step 4: Starting Plone

With our buildout created, now we simply start Zope with the following command:

bin/instance start

Point your browser to http://localhost:8080/manage_main, type in the username and password you supplied to Paster, and add a Plone site through the ZMI. Welcome to Plone on Snow Leopard!