Задача: получить доступ к ораклу из python в Mac OS X.
Скачиваем (на момент написания статьи - отсюда) последние версии instantclient-basic под архитектуры x32 и x64, а также instantclient-sdk под любую платформу - они одинаковые.
Непонятно, что помешало ораклу сделать под Mac OS X universal binary, но раз уж штатный python у нас universal:
file /usr/bin/python
сделаем, пожалуй, oracle instant client под x32 и x64.
Итак,
mkdir -p ~/tmp/ora
cp ~/Downloads/instantclient-* ~/tmp/ora/
cd ~/tmp/ora/
ls -1
instantclient-basic-macos.x32-11.2.0.4.0.zip
instantclient-basic-macos.x64-11.2.0.4.0.zip
instantclient-sdk-macos.x32-11.2.0.4.0.zip
Распаковываем x64 и x32 в разные каталоги, создаем каталог для universal и собственно склеиваем исполняемые файлы и библиотеки:
cd ~/tmp/ora/
unzip instantclient-basic-macos.x32-11.2.0.4.0.zip -d ./32
unzip instantclient-basic-macos.x64-11.2.0.4.0.zip -d ./64
mkdir universal
find ./32/instantclient_11_2 -perm +111 -type f -exec basename {} \; | xargs -n 1 sh -c 'lipo -create -arch i386 ./32/instantclient_11_2/$0 -arch x86_64 ./64/instantclient_11_2/$0 -output ./universal/$0'
Туда же копируем неисполняемые файлы, распаковываем sdk и переносим туда же.
find ./32/instantclient_11_2 -type f ! -perm +111 -exec cp {} ./universal/ \;
unzip instantclient-sdk-macos.x32-11.2.0.4.0.zip
mv ./instantclient_11_2/sdk ./universal/
Удаляем лишнее, делаем симлинки на библиотеки без версии в названии.
rm -rf ./32 ./64 ./instantclient*
cd universal/
ln -s libclntsh.dylib.11.1 libclntsh.dylib
ln -s libocci.dylib.11.1 libocci.dylib
cd ..
Готово. В каталоге universal у нас лежит oracle instant client universal binary.
Осталось поставить cx_Oracle. Я буду делать это в виртуальном окружении.
mkvirtualenv -p /usr/bin/python ora
mv universal ~/.virtualenvs/ora/lib/oracle
export ORACLE_HOME=~/.virtualenvs/ora/lib/oracle
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export LD_LIBRARY_PATH=$ORACLE_HOME
pip install cx_Oracle
Проверяем:
file ~/.virtualenvs/o2/lib/python2.7/site-packages/cx_Oracle.so
~/.virtualenvs/ora/lib/python2.7/site-packages/cx_Oracle.so: Mach-O universal binary with 2 architectures
~/.virtualenvs/ora/lib/python2.7/site-packages/cx_Oracle.so (for architecture x86_64): Mach-O 64-bit bundle x86_64
~/.virtualenvs/ora/lib/python2.7/site-packages/cx_Oracle.so (for architecture i386): Mach-O bundle i386
Все. Хотя нет, не все - каталог, где лежат оракловые библиотеки, должен быть известен в том окружении, в котором запускается python. Будем считать это заданием на дом.