I had some trouble with a new virtualenv — psycopg2 wouldn’t install.
I remembered going though this before, but couldn’t find my notes. I ended up fixing it before finding my notes ( which point to this StackOverflow question http://stackoverflow.com/questions/2088569/how-do-i-force-python-to-be-32-bit-on-snow-leopard-and-other-32-bit-64-bit-quest ) , but I want to share this with others.
psycopg2 was showing compilation errors in relation to some PostgreSQL libraries
> ld: warning: in /Library/PostgreSQL/8.4.5/lib/libpq.dylib, missing required architecture x86_64 in file
so then I checked how the file was built:
lets see how that was built…
$ file /Library/PostgreSQL/8.4.5/lib/
> /Library/PostgreSQL/8.4.5/lib/libpq.dylib: Mach-O universal binary with 2 architectures
> /Library/PostgreSQL/8.4.5/lib/libpq.dylib (for architecture ppc): Mach-O dynamically linked shared library
> /Library/PostgreSQL/8.4.5/lib/libpq.dylib (for architecture i386): Mach-O dynamically linked shared library i386
Crap. it’s built i386 only. The fix is easy right? We just need to export archflags and build.
$ export ARCHFLAGS=”-arch i386″
$ pip install –upgrade psycopg2
That works perfect, right?
Wrong.
> File “/environments/example-2.7.5/lib/python2.7/site-packages/psycopg2/__init__.py”, line 50, in
> from psycopg2._psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID
>ImportError: dlopen(/environments/example-2.7.5/lib/python2.7/site-packages/psycopg2/_psycopg.so, 2): no suitable image found. Did find:
> /environments/example-2.7.5/lib/python2.7/site-packages/psycopg2/_psycopg.so: mach-o, but wrong architecture
I was dumbfounded for a few seconds, then I realized — Python was trying to run 64 bit (x86_64) , but I only have the 32 bit library.
the right fix? Rebuild PostgreSQL to support 64bit.
My PostgrSQL was a prebuilt package, and I don’t have time to fix that, so I need to do a few hacky/janky things
basically , we’re going to force python to run in i386 ( and not 64bit )
go to our virtualenv…
cd /environments/example-2.7.5/bin
back it up
cp python python-original
strip it…
# note that our last arg is the input, and the 2nd to last it output
lipo -thin i386 -output python-i386 python
replace it
rm python
mv python-i386 python
now install psycopg2
export ARCHFLAGS=”-arch i386″
pip install –upgrade psycopg2
yay this works !
now get some work done and save some time so you can build a 64bit PostgreSQL